साझा लाइब्रेरी बनाते समय -fPIC का क्या अर्थ है?


109

मुझे पता है कि ' -fPIC' विकल्प में व्यक्तिगत मॉड्यूल के बीच पते और स्वतंत्रता को हल करने के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि इसका वास्तव में क्या मतलब है। क्या तुम समझा सकते हो?


1
इसके अलावा, अगर आप और अधिक विस्तार से जानना चाहते हैं तो यहां एक बढ़िया लेख है ( akkadia.org/drepper/dsohowto.pdf )
MJ

जवाबों:


61

PIC स्थिति स्वतंत्र कोड के लिए खड़ा है

और बोली के लिए man gcc:

यदि लक्ष्य मशीन के लिए समर्थित है, तो स्थिति-स्वतंत्र कोड का उत्सर्जन करें, जो डायनेमिक लिंकिंग के लिए उपयुक्त है और वैश्विक ऑफसेट तालिका के आकार पर किसी भी सीमा से बचता है। यह विकल्प m68k, PowerPC और SPARC पर फर्क करता है। स्थिति-स्वतंत्र कोड को विशेष समर्थन की आवश्यकता होती है, और इसलिए केवल कुछ मशीनों पर काम करता है।

जब उन उल्लिखित आर्किटेक्चर पर साझा ऑब्जेक्ट (* .so) का निर्माण करते हैं तो इसका उपयोग करें।


1
f का कोई मतलब नहीं है, यह विकल्प नाम का सिर्फ एक हिस्सा है।
ज़िफ्रे

17
Fpic और fPIC में अंतर है। वे दोनों एक ही काम करते हैं लेकिन fpic एक छोटे रिश्तेदार ऑफ़सेट का उपयोग करता है जहाँ उपलब्ध है। इस प्रकार fpic के साथ संकलित करने से संभावित रूप से छोटी फ़ाइलों का उत्पादन किया जा सकता है। दुर्भाग्य से यह हमेशा अपेक्षित रूप से काम नहीं करता है इसलिए fPIC का उपयोग करें। यह भी ध्यान दें कि सभी प्रोसेसर छोटे ऑफसेट का समर्थन नहीं करते हैं, इसलिए इससे फर्क नहीं पड़ सकता है।
मार्टिन

2
'F' इस तरह से हैंगओवर है कि gcc ने कमांड लाइन तर्क दिए (यह कुछ साल पहले था और उन्होंने कोड के इस हिस्से को बदल दिया है जिसे मैंने हाल ही में नहीं देखा है)। लेकिन उस समय अलग-अलग परिस्थितियों में केवल कुछ अक्षरों या संयोजनों की अनुमति थी (कमांड लाइन के तर्कों को परिभाषित करने के लिए एक बहुत ही जटिल भाषा थी) परिणामस्वरूप परिणामस्वरूप कमांड लाइन तर्क के रूप में परिभाषित करने में आसान बनाने के लिए 'f' का उपयोग किया गया था।
मार्टिन यॉर्क

2
यदि कोई बिना fPIC के * .so का निर्माण करे तो क्या होगा?
ईसा ए

2
@IsaA मैं आज स्रोत से एक सी-एपीआई mysql फ़ंक्शन संकलित कर रहा था और यह निर्माण नहीं करेगा, मुझे मिल गया /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इसलिए मैंने fPIC जोड़ा और यह बनाया।
चिली नोव

32

fविकल्प है कि "इंटरफेस सम्मेलनों को नियंत्रित कोड पीढ़ी में इस्तेमाल के लिए" जीसीसी उपसर्ग है

PIC"स्थिति स्वतंत्र कोड" के लिए खड़ा है, इसके बारे में एक विशेषज्ञता है fpicm68k और स्पार्क के लिए।

संपादित करें: 0x6adb015 द्वारा संदर्भित दस्तावेज़ के पृष्ठ 11 को पढ़ने के बाद , और coryan द्वारा टिप्पणी, मैंने कुछ काम किए:

यह विकल्प केवल साझा पुस्तकालयों के लिए समझ में आता है और आप ओएस को ग्लोबल ऑफ़सेट टेबल, जीओटी का उपयोग कर रहे हैं। इसका अर्थ है कि आपके सभी पते संदर्भ GOT के सापेक्ष हैं, और कोड को कई प्रक्रियाओं के साथ साझा किया जा सकता है।

अन्यथा, इस विकल्प के बिना, लोडर को सभी ऑफसेट को संशोधित करना होगा।

कहने की जरूरत नहीं है, हम लगभग हमेशा -fpic / PIC का उपयोग करते हैं।


1
मुझे लगा कि OS किसी भी वर्चुअल एड्रेस में लाइब्रेरी को लोड करने के लिए स्वतंत्र था, लेकिन बिना pic / PIC के लोडर को कोड को संशोधित करना होगा और रूटीन / लाइब्रेरी के वास्तविक स्थानों पर सभी निरपेक्ष कूद + अप्रत्यक्ष को समायोजित करना होगा। Pic / PIC के साथ कोड को संशोधित नहीं किया जाता है और इस प्रकार यह वास्तव में कई प्रक्रियाओं में साझा किया जाता है।
coryan

कई प्रक्रियाएं काफी हद तक संयोग हैं - वे महत्वपूर्ण बिंदु यह है कि कोड को किसी भी वर्चुअल पते पर पूर्णांक पते के न्यूनतम के साथ लोड किया जा सकता है।
जोनाथन लेफ़लर

16

man gcc कहते हैं:

-fpic
  एक साझा में उपयोग के लिए उपयुक्त स्थिति-स्वतंत्र कोड (PIC) उत्पन्न करें
  लाइब्रेरी, यदि लक्ष्य मशीन के लिए समर्थित है। इस तरह के कोड सभी तक पहुंचते हैं
  वैश्विक ऑफसेट तालिका (GOT) के माध्यम से निरंतर पते। गतिशील
  लोडर जीओटी प्रविष्टियों को हल करता है जब प्रोग्राम शुरू होता है (गतिशील)
  लोडर जीसीसी का हिस्सा नहीं है; यह ऑपरेटिंग सिस्टम का हिस्सा है)। अगर
  लिंक किए गए निष्पादन योग्य के लिए GOT का आकार एक मशीन-विशिष्ट से अधिक है
  अधिकतम आकार, आपको लिंक करने वाले से एक त्रुटि संदेश मिलता है
  कि -fpic काम नहीं करता है; उस स्थिति में, बजाय -fPIC के साथ recompile।
  (ये मैक्सिमम SPARC पर 8k और m68k और RS / 6000 पर 32k हैं।
  386 की ऐसी कोई सीमा नहीं है।)

  स्थिति-स्वतंत्र कोड को विशेष समर्थन की आवश्यकता होती है, और इसलिए
  केवल कुछ मशीनों पर काम करता है। 386 के लिए, GCC PIC के लिए समर्थन करता है
  सिस्टम V लेकिन सूर्य 386i के लिए नहीं। के लिए कोड जनरेट किया गया
  IBM RS / 6000 हमेशा स्थिति-स्वतंत्र है।

-fPIC
  यदि लक्ष्य मशीन के लिए समर्थित है, तो स्थिति-स्वतंत्र कोड का उत्सर्जन करें,
  डायनामिक लिंकिंग और आकार के किसी भी सीमा से बचने के लिए उपयुक्त है
  वैश्विक ऑफसेट तालिका। यह विकल्प m68k पर एक अंतर बनाता है
  और स्पार्क।

  स्थिति-स्वतंत्र कोड को विशेष समर्थन की आवश्यकता होती है, और इसलिए
  केवल कुछ मशीनों पर काम करता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.