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