मुझे पता है कि ' -fPIC
' विकल्प में व्यक्तिगत मॉड्यूल के बीच पते और स्वतंत्रता को हल करने के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि इसका वास्तव में क्या मतलब है। क्या तुम समझा सकते हो?
मुझे पता है कि ' -fPIC
' विकल्प में व्यक्तिगत मॉड्यूल के बीच पते और स्वतंत्रता को हल करने के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि इसका वास्तव में क्या मतलब है। क्या तुम समझा सकते हो?
जवाबों:
PIC स्थिति स्वतंत्र कोड के लिए खड़ा है
और बोली के लिए man gcc
:
यदि लक्ष्य मशीन के लिए समर्थित है, तो स्थिति-स्वतंत्र कोड का उत्सर्जन करें, जो डायनेमिक लिंकिंग के लिए उपयुक्त है और वैश्विक ऑफसेट तालिका के आकार पर किसी भी सीमा से बचता है। यह विकल्प m68k, PowerPC और SPARC पर फर्क करता है। स्थिति-स्वतंत्र कोड को विशेष समर्थन की आवश्यकता होती है, और इसलिए केवल कुछ मशीनों पर काम करता है।
जब उन उल्लिखित आर्किटेक्चर पर साझा ऑब्जेक्ट (* .so) का निर्माण करते हैं तो इसका उपयोग करें।
/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 जोड़ा और यह बनाया।
f
विकल्प है कि "इंटरफेस सम्मेलनों को नियंत्रित कोड पीढ़ी में इस्तेमाल के लिए" जीसीसी उपसर्ग है
PIC
"स्थिति स्वतंत्र कोड" के लिए खड़ा है, इसके बारे में एक विशेषज्ञता है fpic
m68k और स्पार्क के लिए।
संपादित करें: 0x6adb015 द्वारा संदर्भित दस्तावेज़ के पृष्ठ 11 को पढ़ने के बाद , और coryan द्वारा टिप्पणी, मैंने कुछ काम किए:
यह विकल्प केवल साझा पुस्तकालयों के लिए समझ में आता है और आप ओएस को ग्लोबल ऑफ़सेट टेबल, जीओटी का उपयोग कर रहे हैं। इसका अर्थ है कि आपके सभी पते संदर्भ GOT के सापेक्ष हैं, और कोड को कई प्रक्रियाओं के साथ साझा किया जा सकता है।
अन्यथा, इस विकल्प के बिना, लोडर को सभी ऑफसेट को संशोधित करना होगा।
कहने की जरूरत नहीं है, हम लगभग हमेशा -fpic / PIC का उपयोग करते हैं।
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 पर एक अंतर बनाता है और स्पार्क। स्थिति-स्वतंत्र कोड को विशेष समर्थन की आवश्यकता होती है, और इसलिए केवल कुछ मशीनों पर काम करता है।