लिनक्स, जीएनयू जीसीसी, एलडी, संस्करण स्क्रिप्ट और ईएलएफ बाइनरी प्रारूप - यह कैसे काम करता है?


13

मैं लिनक्स में लाइब्रेरी वर्जनिंग के बारे में और जानने की कोशिश कर रहा हूं कि इसे कैसे काम करना है। यहाँ संदर्भ है:

- मेरे पास डायनेमिक लाइब्रेरी के दो संस्करण हैं जो इंटरफेस के एक ही सेट को कहते हैं libsome1.soऔर कहते हैं libsome2.so

- एक आवेदन के खिलाफ जुड़ा हुआ है libsome1.so

- यह एप्लिकेशन libdl.soगतिशील रूप से किसी अन्य मॉड्यूल को लोड करने के लिए कहता है, कहते हैं libmagic.so

- अब के libmagic.soखिलाफ जुड़ा हुआ है libsome2.so। जाहिर है, libmagic.soरन-टाइम में प्रतीकों को छिपाने के लिए लिंकर स्क्रिप्ट का उपयोग किए बिना, इंटरफेस में सभी कॉल को libsome2.soहल किया जाता है libsome1.so। इसकी पुष्टि libVersion()मैक्रो के मूल्य के खिलाफ लौटाए गए मूल्य की जांच करके की जा सकती है LIB_VERSION

- इसलिए मैं libmagic.soएक लिंक स्क्रिप्ट के संकलन और लिंक के बगल में कोशिश करता हूं जो 3 को छोड़कर सभी प्रतीकों को छुपाता है जो इसमें परिभाषित libmagic.soहोते हैं और इसके द्वारा निर्यात किए जाते हैं। यह काम करता है ... या कम से कम libVersion()और LIB_VERSIONमान मेल खाते हैं (और यह संस्करण 2 नहीं 1 रिपोर्ट करता है)।

- हालांकि, जब कुछ डेटा संरचनाओं को डिस्क में क्रमबद्ध किया जाता है, तो मैंने कुछ भ्रष्टाचार पर ध्यान दिया। आवेदन की निर्देशिका में यदि मैं libsome1.soइंगित करने के लिए अपनी जगह में एक नरम लिंक हटाता हूं और बनाता हूं libsome2.so, तो सब कुछ अपेक्षित रूप से काम करता है और समान भ्रष्टाचार नहीं होता है।

मैं मदद नहीं कर सकता, लेकिन लगता है कि प्रतीकों के रन-टाइम लिंकर के रिज़ॉल्यूशन में कुछ संघर्ष के कारण ऐसा हो सकता है। मैंने कई चीजों की कोशिश की है, जैसे लिंक करने की कोशिश करना libsome2.soताकि सभी प्रतीकों को बदल दिया जाए symbol@@VER_2(जो मैं अभी भी उलझन में हूं क्योंकि कमांड nm -CD libsome2.soअभी भी प्रतीकों को सूचीबद्ध करता है symbolऔर नहीं symbol@@VER_2) ... कुछ भी काम नहीं लगता है !!! मदद!!!!!!


आपका अंतिम दृष्टिकोण वह है जिसे मैंने शुरू किया होगा। और मैं मानता हूं कि भ्रष्टाचार शायद कुछ प्रतीक भ्रम है। अफसोस की बात है कि मेरे पास आपके लिए कोई जवाब नहीं है।
रोबॉटहूमंस

यह एसओ पर बेहतर कर सकता है, हालांकि tbh मुझे यकीन है कि यह कहने के लिए पर्याप्त नहीं है। यदि आप हमें इसे स्थानांतरित करना चाहते हैं तो इसे ध्वजांकित करें।
xenoterracide

1
आप अनुप्रयोग में झंडे RTLD_LOCALऔर RTLD_DEEPBINDdlopen झंडे का प्रयास करें । मेरे पास अभी इसका परीक्षण करने का समय नहीं है, लेकिन इसे मैनपेज के आधार पर काम करना चाहिए।
स्ट्रिबिका

जवाबों:


13

यह बिल्कुल आपके सवाल का जवाब नहीं है, लेकिन ...

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

साझा लाइब्रेरी को नाम देने के लिए आमतौर पर तीन फॉर्म होते हैं, पहला फॉर्म केवल इनसो में समाप्त होता है। उदाहरण के लिए, रीडलाइन नामक लाइब्रेरी को libreadline.so नामक फ़ाइल में संग्रहीत किया जाता है और सामान्य रूप से / lib, / usr / lib, या usr / स्थानीय / lib में से एक के अंतर्गत स्थित होता है। वह फ़ाइल स्थित है जब -Lreadline जैसे विकल्प के साथ सॉफ़्टवेयर संकलित करना। -l कंपाइलर को निम्नलिखित लाइब्रेरी से लिंक करने के लिए कहता है। क्योंकि पुस्तकालय समय-समय पर बदलते रहते हैं, इसलिए यह अप्रचलित हो सकता है, इसलिए पुस्तकालयों में कुछ नाम लिखा होता है। रीडलाइन के लिए SONAME libreadline.so.2 की तरह दिख सकता है, जो वर्ब्रेडलाइन के दूसरे संस्करण के प्रमुख संस्करण के लिए है। रीडलाइन के कई छोटे संस्करण भी हो सकते हैं जो संगत हैं और सॉफ़्टवेयर को पुन: उपयोग करने की आवश्यकता नहीं है। रीडलाइन के एक मामूली संस्करण का नाम libreadline.so.2.14 हो सकता है। आम तौर पर libreadline। इसलिए इस मामले में रीडलाइन, libreadline.so.2 के सबसे हालिया प्रमुख संस्करण का सिर्फ एक प्रतीकात्मक लिंक है। libreadline.so.2 भी libreadline.so.2.14 का एक प्रतीकात्मक लिंक है जो वास्तव में उपयोग की जा रही फ़ाइल है।

लाइब्रेरी का SONAME लाइब्रेरी फ़ाइल के अंदर ही एम्बेडेड है। फ़ाइल के अंदर कहीं libreadline.so.2.14 स्ट्रिंग libreadline.so.2 है। जब कोई प्रोग्राम रीडलाइन के साथ संकलित और लिंक किया जाता है, तो वह फ़ाइल libreadline.so को खोजेगा और उसमें लिखी SONAME को पढ़ेगा। बाद में, जब प्रोग्राम वास्तव में निष्पादित होता है, तो वह libreadline.so.2 को लोड करेगा, न कि केवल libreadline.so, क्योंकि यह उस SONAME को पढ़ा गया था जब इसे पहली बार लिंक किया गया था। यह एक सिस्टम को रीडलाइन स्थापित करने के कई असंगत संस्करणों को रखने की अनुमति देता है, और प्रत्येक प्रोग्राम उपयुक्त प्रमुख संस्करण को लोड करेगा जिसे इसके साथ जोड़ा गया था। इसके अलावा, जब रीडलाइन को अपग्रेड किया जाता है, तो 2.17 में कहें, मैं केवल मौजूदा लाइब्रेरी के साथ libreadline.so.2.17 स्थापित कर सकता हूं, और एक बार मैं libreadline.so.2.13 से libreadline.so.2.17 तक प्रतीकात्मक लिंक libreadline.so.2 ले जाऊंगा।

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