ভাগ করা লাইব্রেরি তৈরি করার সময় -fPIC এর অর্থ কী?


109

আমি জানি ' -fPIC' বিকল্পটি পৃথক মডিউলগুলির মধ্যে ঠিকানাগুলির সমাধান এবং স্বতন্ত্রতার সাথে কিছু করার আছে তবে আমি নিশ্চিত নই যে এর প্রকৃত অর্থ কী। তুমি কি ব্যাখ্যা করতে পারো?


1
এছাড়াও আপনি আরও বিশদে জানতে চাইলে এখানে একটি দুর্দান্ত নিবন্ধ রয়েছে ( akkadia.org/drepper/dsohowto.pdf )
এমজে

উত্তর:


61

পিআইসি মানে পজিশন ইন্ডিপেন্ডেন্ট কোড

এবং উদ্ধৃতি man gcc:

যদি লক্ষ্য মেশিনের জন্য সমর্থিত হয় তবে গতিশীল সংযোগের জন্য উপযুক্ত এবং অবস্থান সম্পর্কিত স্বাধীন কোড নির্গত করুন এবং গ্লোবাল অফসেট সারণির আকারের কোনও সীমা এড়ানো উচিত। এই বিকল্পটি এম 68 কে, পাওয়ারপিসি এবং স্পারকে একটি পার্থক্য করে। অবস্থান-স্বতন্ত্র কোডটির জন্য বিশেষ সমর্থন প্রয়োজন এবং তাই কেবলমাত্র নির্দিষ্ট মেশিনে কাজ করে।

উল্লিখিত আর্কিটেকচারগুলিতে ভাগ করা অবজেক্ট (* .so) তৈরি করার সময় এটি ব্যবহার করুন।


1
চ কিছু বোঝায় না, এটি বিকল্প নামের একটি অংশ।
জিফ্রে

17
Fpic এবং fPIC এর মধ্যে পার্থক্য রয়েছে। তারা উভয়ই একই কাজ করে তবে এফপিক যেখানে উপলব্ধ সেখানে একটি সংক্ষিপ্ত আপেক্ষিক ব্যবহার করে। সুতরাং fpic সঙ্গে সংকলন সম্ভাব্য ছোট ফাইল উত্পাদন করতে পারে। দুর্ভাগ্যক্রমে এটি সর্বদা প্রত্যাশিতভাবে কাজ করে না তাই FPIC ব্যবহার করুন। এছাড়াও নোট করুন যে সমস্ত প্রসেসর সংক্ষিপ্ত অফসেটগুলিকে সমর্থন করে না যাতে এটি কোনও পার্থক্য না করে।
মার্টিন ইয়র্ক

2
'চ' হ'ল জি সি সি হ্যান্ডেল কমান্ড লাইন আর্গুমেন্টের একটি হ্যাংওভার (এটি কয়েক বছর আগে ছিল এবং তারা কোডটির এই অংশটি আমি সম্প্রতি দেখিনি। তবে সেই সময়ে শুধুমাত্র বিভিন্ন শর্তে নির্দিষ্ট অক্ষর বা সংমিশ্রণের অনুমতি দেওয়া হত (কমান্ড লাইন আর্গুমেন্ট সংজ্ঞায়িত করার জন্য খুব জটিল ভাষা ছিল) ফলস্বরূপ 'f' ব্যবহার করে কমান্ড লাইন আর্গুমেন্ট হিসাবে এটি সংজ্ঞায়িত করা সহজ হয়।
মার্টিন ইয়র্ক

2
কেউ যদি এফপিআইসি ব্যতীত * .so তৈরি করে তবে কী হবে?
Isa

2
@ আইসএ আমি উত্স থেকে আজ একটি সি-এপিআই মাইএসকিএল ফাংশন সংকলন করছিলাম এবং এটি তৈরি করবে না, /usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPICতাই আমি এফপিআইসি যুক্ত করেছি এবং এটি নির্মিত হয়েছে।
মরিচ 21

32

fঅপশন যে "ইন্টারফেস নিয়মাবলী নিয়ন্ত্রণ কোড নির্মাণ ব্যবহৃত" জন্য জিসিসি প্রিফিক্স

এর PICঅর্থ দাঁড়ায় "পজিশন ইন্ডিপেন্ডেন্ট কোড", এটি fpicএম 68 কে এবং এসপিআরসি-র একটি বিশেষত্ব।

সম্পাদনা করুন: 0x6adb015 দ্বারা উল্লিখিত নথির 11 নম্বর পৃষ্ঠা এবং কোরিয়ান দ্বারা মন্তব্য করার পরে, আমি কয়েকটি পরিবর্তন করেছি:

এই বিকল্পটি কেবল ভাগ করা লাইব্রেরিগুলির জন্যই অর্থবোধ করে এবং আপনি ওএসকে বলছেন যে আপনি গ্লোবাল অফসেট টেবিল ব্যবহার করছেন, গট। এর অর্থ আপনার সমস্ত ঠিকানা উল্লেখগুলি জিওটির সাথে সম্পর্কিত এবং কোডটি একাধিক প্রক্রিয়া জুড়ে ভাগ করা যায়।

অন্যথায়, এই বিকল্পটি ছাড়া লোডারকে সমস্ত অফসেট নিজেই সংশোধন করতে হবে।

বলা বাহুল্য, আমরা প্রায়শই -Fpic / PIC ব্যবহার করি।


1
আমি ভেবেছিলাম যে কোনও ভার্চুয়াল ঠিকানায় ওএস গ্রন্থাগারটি লোড করতে মুক্ত, তবে পিক / পিআইসি ছাড়াই লোডারকে কোডটি সংশোধন করতে হবে এবং রুটিন / লাইব্রেরির প্রকৃত অবস্থানগুলিতে সমস্ত নিখুঁত লাফ + ইন্ডিয়ারেশন সামঞ্জস্য করতে হবে। পিক / পিকের সাহায্যে কোডটি সংশোধিত হয় না এবং এটি একাধিক প্রক্রিয়াতে সত্যিই ভাগ করা হয়।
কোরিয়ান

একাধিক প্রক্রিয়া মূলত কাকতালীয় - এগুলির মূল বক্তব্য হ'ল কোডটি কোনও ভার্চুয়াল ঠিকানায় নিখুঁত ন্যূনতম ঠিকানা স্থির করে লোড করা যায়।
জোনাথন লেফলার

16

man gcc বলেছেন:

-fpic
  ভাগ করে নেওয়ার জন্য উপযুক্ত অবস্থান-স্বতন্ত্র কোড (পিক) উত্পন্ন করুন
  লাইব্রেরি, লক্ষ্য মেশিনের জন্য সমর্থিত হলে। এই জাতীয় কোড সমস্ত অ্যাক্সেস করে
  গ্লোবাল অফসেট টেবিলের মাধ্যমে ধ্রুবক ঠিকানাগুলি (জিওটি)। গতিশীল
  প্রোগ্রামটি শুরু হওয়ার সাথে সাথে লোডার জিওটি এন্ট্রিগুলি সমাধান করে (গতিশীল
  লোডার জিসিসির অংশ নয়; এটি অপারেটিং সিস্টেমের অংশ)। যদি
  লিঙ্কযুক্ত এক্সিকিউটেবলের জন্য জিওটি আকার কোনও মেশিন-নির্দিষ্টকে ছাড়িয়ে যায়
  সর্বাধিক আকার, আপনি লিঙ্কার ইঙ্গিত করে একটি ত্রুটি বার্তা পাবেন
  যে -fpic কাজ করে না; সেক্ষেত্রে পরিবর্তে -fPIC দিয়ে পুনরায় কম্পাইল করুন।
  (এই সর্বাধিকগুলি SPARC এ 8k এবং m68k এবং RS / 6000 এ 32k।
  386 এর কোনও সীমা নেই))

  অবস্থান-স্বতন্ত্র কোডটির জন্য বিশেষ সমর্থন প্রয়োজন and
  শুধুমাত্র নির্দিষ্ট মেশিনে কাজ করে। 386 এর জন্য, জিসিসি পিআইসি সমর্থন করে
  সিস্টেম ভি কিন্তু সান 386i এর জন্য নয়। কোড উত্পন্ন
  আইবিএম আরএস / 6000 সর্বদা অবস্থান-স্বতন্ত্র।

-fPIC
  যদি লক্ষ্য মেশিনের জন্য সমর্থিত হয় তবে অবস্থান-স্বতন্ত্র কোড নির্গত করুন,
  গতিশীল সংযোগ এবং আকারের কোনও সীমা এড়ানোর জন্য উপযুক্ত
  গ্লোবাল অফসেট টেবিল। এই বিকল্পটি m68k এ পার্থক্য করে
  এবং স্পার্ক।

  অবস্থান-স্বতন্ত্র কোডটির জন্য বিশেষ সমর্থন প্রয়োজন and
  শুধুমাত্র নির্দিষ্ট মেশিনে কাজ করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.