मैं लिनक्स में लाइब्रेरी वर्जनिंग के बारे में और जानने की कोशिश कर रहा हूं कि इसे कैसे काम करना है। यहाँ संदर्भ है:
- मेरे पास डायनेमिक लाइब्रेरी के दो संस्करण हैं जो इंटरफेस के एक ही सेट को कहते हैं 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
) ... कुछ भी काम नहीं लगता है !!! मदद!!!!!!
RTLD_LOCAL
और RTLD_DEEPBIND
dlopen झंडे का प्रयास करें । मेरे पास अभी इसका परीक्षण करने का समय नहीं है, लेकिन इसे मैनपेज के आधार पर काम करना चाहिए।