2009-06-08 15 views
84

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

उत्तर

45

पीआईसी स्थिति स्वतंत्र कोड के लिए खड़ा है

और man gcc उद्धृत करने के लिए:

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

उन निर्दिष्ट आर्किटेक्चर पर साझा ऑब्जेक्ट्स (* .so) बनाने के दौरान इसका उपयोग करें।

+1

एफपीआईसी का एफ हिस्सा क्या है? –

+1

एफ का मतलब कुछ भी नहीं है, यह विकल्प नाम का सिर्फ एक हिस्सा है। – Zifre

+15

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

15

man gcc का कहना है:

 
-fpic 
    Generate position-independent code (PIC) suitable for use in a shared 
    library, if supported for the target machine. Such code accesses all 
    constant addresses through a global offset table (GOT). The dynamic 
    loader resolves the GOT entries when the program starts (the dynamic 
    loader is not part of GCC; it is part of the operating system). If 
    the GOT size for the linked executable exceeds a machine-specific 
    maximum size, you get an error message from the linker indicating 
    that -fpic does not work; in that case, recompile with -fPIC instead. 
    (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. 
    The 386 has no such limit.) 

    Position-independent code requires special support, and therefore 
    works only on certain machines. For the 386, GCC supports PIC for 
    System V but not for the Sun 386i. Code generated for the 
    IBM RS/6000 is always position-independent. 

-fPIC 
    If supported for the target machine, emit position-independent code, 
    suitable for dynamic linking and avoiding any limit on the size of 
    the global offset table. This option makes a difference on the m68k 
    and the SPARC. 

    Position-independent code requires special support, and therefore 
    works only on certain machines. 
20

f विकल्प के लिए जीसीसी उपसर्ग कि "स्थिति स्वतंत्र कोड" के लिए

PIC खड़ा "को नियंत्रित इंटरफ़ेस सम्मेलनों कोड पीढ़ी में इस्तेमाल किया", यह है m68K और SPARC के लिए fpic का एक विशेषज्ञता।

संपादित करें:

यह विकल्प केवल साझा पुस्तकालयों के लिए समझ में आता है और आप ओएस आप एक प्रयोग कर रहे हैं कह रहे हैं: document referenced by 0x6adb015, और coryan द्वारा टिप्पणी की पृष्ठ 11 पढ़ने के बाद, मैं कुछ बदलाव किए हैं ग्लोबल ऑफ़सेट टेबल, गॉट। इसका मतलब है कि आपके सभी पता संदर्भ जीओटी के सापेक्ष हैं, और कोड को कई प्रक्रियाओं में साझा किया जा सकता है।

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

कहने की जरूरत नहीं है, हम लगभग हमेशा -फिक/पीआईसी का उपयोग करते हैं।

+0

मैंने सोचा था कि ओएस किसी भी आभासी पते में पुस्तकालय लोड करने के लिए स्वतंत्र था, लेकिन तस्वीर/पीआईसी के बिना लोडर को कोड को संशोधित करना होगा और दिनचर्या/पुस्तकालयों के वास्तविक स्थानों पर सभी पूर्ण कूद + संकेतों को समायोजित करना होगा। तस्वीर/पीआईसी के साथ कोड संशोधित नहीं किया गया है और इस प्रकार यह वास्तव में कई प्रक्रियाओं में साझा किया जाता है। – coryan

+0

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