2011-08-05 9 views
13

ऑब्जेक्ट फ़ाइल में कोड को संकलित करने के लिए स्थिति-स्वतंत्र होने की आवश्यकता है यदि ऑब्जेक्ट फ़ाइल को साझा लाइब्रेरी (.so) के रूप में लोड करने का इरादा है, क्योंकि मूल ऑब्जेक्ट फ़ाइल को साझा ऑब्जेक्ट फ़ाइल को विभिन्न प्रक्रियाओं में लोड किया जा सकता है विभिन्न।क्या 32 बिट x86 कोड साझा लाइब्रेरी फ़ाइलों के लिए विशेष रूप से पीआईसी-संकलित होना चाहिए?

अब मैं, त्रुटियों का सामना नहीं किया था जब मैं एक .so फ़ाइल संकलित और 32 बिट x86 कंप्यूटर पर -fpic जीसीसी विकल्प के बिना जुड़ा हुआ लोड करने का प्रयास करते हुए इसे 64 बिट बिट x86 कंप्यूटर पर विफल रहता है।

रैंडम वेबसाइटों मैंने पाया कहना है कि मैं क्योंकि कोड X86 32 बिट ABI भी जब एक स्थिति के मामले में स्वतंत्र तरीके से इस्तेमाल के अनुसार संयोग से -fpic काम करता है बिना संकलित 32 बिट पर -fpic जरूरत नहीं है। लेकिन मुझे अभी भी सॉफ़्टवेयर मिला है जो पुस्तकालयों के अलग-अलग संस्करणों के साथ अपने 32 बिट संस्करणों में शिप करता है: एक पीआईसी के लिए, और गैर-पीआईसी के लिए एक। उदाहरण के लिए, libirc.a और libirc_pic.a के साथ इंटेल कंपाइलर जहाजों को बाद में स्थिति-स्वतंत्र मोड के लिए संकलित किया जा रहा है (यदि कोई .a फ़ाइल को .so फ़ाइल में लिंक करना चाहता है)।

मुझे आश्चर्य है कि क्या -fpic का उपयोग करने और नहीं यह 32 बिट कोड के लिए है का उपयोग कर, और क्यों कुछ संकुल, इंटेल संकलक की तरह बीच सटीक अंतर है, अभी भी पुस्तकालयों में से अलग-अलग संस्करण के साथ जहाज?

+0

क्या आपने टीएलएस का उपयोग कर कोड के गैर-भौतिक संकलन को आजमाया था? या ओवरलैपिंग मेमोरी श्रेणियों के साथ कई गैर-तस्वीर पुस्तकालयों को लोड करें? अलग स्थैतिक libs कार्यक्रमों में स्थिर रूप से लिंक करने के लिए हैं (libirc.a; कोई तस्वीर थोड़ा तेज है) और .so पुस्तकालयों में स्थिर रूप से (_pic.a संस्करण)। – osgx

+0

देखें http://stackoverflow.com/questions/3146744/difference-in-position-independent-code-x86-vs-x86-64 – AProgrammer

उत्तर

0

आधार आभासी पता है कि साझा वस्तु फ़ाइल विभिन्न प्रक्रियाओं में में लोड किया जाता क्योंकि साझा वस्तुओं आमतौर पर उनके पसंदीदा पते पर लोड अलग

हो सकता है, वे सही ढंग से काम करने के लिए प्रकट हो सकता है । लेकिन fPIC सभी साझा कोड के लिए एक अच्छा विचार है।

मुझे विश्वास है कि पुस्तकालय के दो संस्करण अक्सर नहीं हैं कि कई वितरण fPIC का उपयोग सभी कोड के लिए डिफ़ॉल्ट के रूप में करते हैं।

+3

साझा ऑब्जेक्ट आमतौर पर पता 0 पर लोड से जुड़े होते हैं, और वे निश्चित रूप से लोड नहीं होते हैं क्या आप वहां मौजूद हैं। –

+0

क्या @ नियोजित रूसी ने कहा। साथ ही, आप पुस्तकालयों को प्राथमिक आधार पते बनाने के लिए 'प्रीलिंक' कर सकते हैं, लेकिन यह सामान्य लिंकिंग से एक अलग (और वैकल्पिक) चरण है। – ninjalj

+1

@ नियोजित रूसी: क्या वह एक लिनक्स-केवल चीज है?अन्य ओएस 100% आधार पते के संघर्ष के लिए डिफ़ॉल्ट रूप से इतने बेवकूफ नहीं हैं। –

10

ऐसा नहीं है कि गैर-पीआईसी कोड x86 (32-बिट) पर "संयोग से" काम करता है। यह है कि x86 के लिए गतिशील लिंकर इसे काम करने के लिए आवश्यक "textrels" का समर्थन करता है। यह मेमोरी खपत और स्टार्टअप समय में बहुत अधिक लागत पर आता है, क्योंकि मूल रूप से पूरे कोड सेगमेंट को लोड समय पर पैच किया जाना चाहिए (और इस प्रकार गैर-साझा करने योग्य मेमोरी बन जाती है)।

गतिशील लिंकर देखरेख का दावा है कि गैर पीआईसी साझा पुस्तकालयों (तत्काल पता विस्थापन से 32-बिट बड़ा नहीं हो सकता) वास्तुकला में बुनियादी मुद्दों की वजह से x86_64 पर समर्थित नहीं किया जा सकता है, लेकिन इस समस्या को आसानी से हल किया जा सकता है आभासी पता स्थान के पहले 4 जीबी में हमेशा पुस्तकालयों को लोड करके। निस्संदेह पीआईसी कोड x86_64 पर बहुत सस्ता है (पीआईसी एक प्रदर्शन-हत्यारा नहीं है जैसे कि यह 32-बिट x86 पर है) ताकि वे इसे असमर्थित रखने और मूर्खों को गैर-पीआईसी पुस्तकालय बनाने से रोक सकें ...

+0

धन्यवाद, यह समझ में आता है। यदि मैं x86 पर एक पीआईसी लिब संकलित करता हूं, तो अब यह टेक्स्ट्रल्स का उपयोग नहीं करता है, मुझे संदेह है? फिर भी यह एक प्रदर्शन-हत्यारा क्यों है? –

+6

पीआईसी कोड को आधार पता रखने के लिए एक अतिरिक्त रजिस्टर की आवश्यकता है। X86 पर आपके पास पहले से ही बहुत कम रजिस्ट्रार हैं, इसलिए एक और को रिजर्व करने से कंपाइलर स्पिलर को स्मृति में और भी अधिक बार बनाता है। –

+2

पीआईसी x86 पर एक प्रदर्शन-हत्यारा है क्योंकि जीओटी रजिस्टर लोड करना महंगा है। इसके लिए एक फंक्शन कॉल और स्टैक से रिटर्न पते को पढ़ने/सहेजने की आवश्यकता होती है। x86_64 में 'eip'- रिश्तेदार एड्रेसिंग है जिससे इसे कोई गॉट रजिस्टर की आवश्यकता नहीं है। –

संबंधित मुद्दे