2009-10-19 8 views
26

कम से कम लिनक्स और सोलारिस पर, स्थिर पुस्तकालय वास्तव में संकलित का एक समूह हैं। इसलिए एक बड़ी फ़ाइल में फेंक दिया गया है। एक स्थिर पुस्तकालय संकलित करते समय, आमतौर पर -फिक ध्वज ओमेटेड होता है, इसलिए जेनरेट कोड स्थिति निर्भर होता है।एक स्थिर लाइब्रेरी के खिलाफ साझा लाइब्रेरी को जोड़ना: क्या एक क्लासिक लाइब्रेरी को अलग-अलग संकलित किया जाना चाहिए यदि कोई एप्लिकेशन इसे लिंक कर रहा हो?

अब कहें कि मेरी स्थिर लाइब्रेरी बी है। मैंने इसे बनाया है और परिणामी .a फ़ाइल है जो वास्तव में सभी स्थिति निर्भर हैं .o फाइलों का सिर्फ एक ग्लोब है। अब मेरे पास एक साझा लाइब्रेरी है जिसे मैं बनाना चाहता हूं, ए, और मैं इसे स्थिर रूप से लिंक करना चाहता हूं। जब मैं ए बनाता हूं, स्वाभाविक रूप से मैं जेनरेट कोड स्थिति स्वतंत्र बनाने के लिए -फिक ध्वज का उपयोग करूंगा। लेकिन अगर मैं बी के खिलाफ लिंक करता हूं, तो क्या मैं निर्भर स्थिति को मिश्रित नहीं कर सकता हूं और स्वतंत्र ऑब्जेक्ट फाइलों को स्थिति में रख सकता हूं?

मुझे बहुत से टेक्स्ट रिलायंस त्रुटियां मिल रही हैं जब तक कि मैं -मिंपूर-टेक्स्ट भी निर्दिष्ट नहीं करता, और मुझे लगता है कि यह शायद कारण हो। ऐसा लगता है कि जब मैं एक लाइब्रेरी संकलित करता हूं, तो मुझे इसे बार, एक साझा संस्करण, एक स्थिर संस्करण, और एक स्थैतिक-का-उपयोग-द्वारा-साझा-साझा-libs संस्करण संकलित करने की आवश्यकता है। क्या मैं सही हू? मैं बस-मिंपर-टेक्स्ट का उपयोग कर सकता हूं लेकिन जी ++ मैन पेज कहता है कि यदि आप ऐसा करते हैं तो ऑब्जेक्ट वास्तव में साझा नहीं हो रहा है (यह अस्पष्ट है कि यह सभी बिना साझा किए गए हैं या केवल स्थिर रूप से जुड़े हुए हिस्सों हैं, क्या किसी को पता है?) ।

+0

प्रश्न सही ढंग से कहा गया है, वह पहले पैराग्राफ में '-फिक' छोड़ देता है, जिससे स्थिति-निर्भर कोड होता है, फिर इसे दूसरे पैराग्राफ में उपयोग किया जाता है, जिससे स्थिति-स्वतंत्र कोड होता है। –

उत्तर

24

आपको साझा वस्तुओं में पीआईसी कोड का उपयोग करने की आवश्यकता नहीं है (जैसा कि आपने पाया है कि आप इसे अनुमति देने के लिए -मिंपुर-टेक्स्ट विकल्प का उपयोग कर सकते हैं)।

उस ने कहा, साझा वस्तुओं में गैर-पीआईसी कोड अधिक हेवीवेट है। पीआईसी कोड के साथ, स्मृति में टेक्स्ट पेज डिस्क पर टेक्स्ट पेजों की सीधी मेमोरी मैपिंग हैं। इसका अर्थ यह है कि यदि एकाधिक प्रक्रिया साझा ऑब्जेक्ट का उपयोग कर रही हैं, तो वे मेमोरी पेज साझा कर सकते हैं।

लेकिन यदि आपके पास पीआईसी कोड नहीं है, तो रनटाइम लिंकर साझा ऑब्जेक्ट लोड करता है, तो उसे टेक्स्ट पेज पर फ़िक्सअप लागू करना होगा। इसका अर्थ यह है कि साझा ऑब्जेक्ट का उपयोग करने वाली प्रत्येक प्रक्रिया में यह किसी भी टेक्स्ट पेज का अपना अनूठा संस्करण होगा जिसमें उस पर फ़िक्सअप होगा (भले ही साझा ऑब्जेक्ट उसी पते पर लोड हो, भले ही कॉपी-ऑन-राइट केवल नोटिस करें कि पृष्ठ था संशोधित और नहीं कि यह उसी तरह संशोधित किया गया था)।

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

लेकिन यदि यह मामला नहीं है और केवल एक ही प्रक्रिया साझा वस्तु को लोड किया गया है, तो यह लगभग उतना ही महत्वपूर्ण नहीं है।

+0

दरअसल, अगर आपको पता है कि केवल एक प्रक्रिया इसे लोड करने जा रही है, तो क्या यह तस्वीर के बिना संकलित करने के लिए एक प्रदर्शन लाभ नहीं हो सकता है? एक रजिस्टर को बचाने के कारण। –

+1

@ जोसेफ गारविन पीआईसी 32 बिट x86 कोड में एक रजिस्टर का उपभोग करता है, लेकिन 64 बिट कोड में नहीं। X64 निर्देश सेट प्रोग्राम काउंटर सापेक्ष एड्रेसिंग का समर्थन करता है - लोड डेटा जो वर्तमान में निष्पादन निर्देश (अगले अनुदेश के बाद) के स्मृति पते से एनएनएनएन बाइट ऑफसेट है।X64 में पीआईसी कोड के लिए कोई गॉट पॉइंटर रजिस्टर की आवश्यकता नहीं है। – dthorpe

+0

एक महान स्पष्टीकरण के लिए धन्यवाद! – rkellerm

1

वैकल्पिक दृष्टिकोण के रूप में, दो पुस्तकालयों को शिप करें: आपके साझा किए गए एक और स्थिर जो आप साथ जुड़े हुए हैं। उन्हें अंतिम निष्पादन योग्य में सही ढंग से लिंक करना चाहिए।

3

मैं एक स्थिर लाइब्रेरी के साझा ऑब्जेक्ट लाइब्रेरी संस्करण के लिए लिंक चरण में निम्न कार्य करता हूं: g ++ -shared -o libshared.so -Wl, - संपूर्ण-संग्रह -fPIC -lstatic -Wl, - no- पूरे संग्रह। चूंकि - होल-आर्काइव प्रत्येक ऑब्जेक्ट को स्थिर लिब्स (फॉर्म libstatic.a के रूप में) में जोड़ता है, मुझे विश्वास है कि -fPIC के साथ उस सूची (सूची) से पहले सभी ओपी की ज़रूरत है।

+0

क्या आप कृपया अधिक स्पष्ट रूप से समझा सकते हैं? – gyro

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

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