मैं लिनक्स में लाइब्रेरी वर्जनिंग और इसे सब कुछ काम करने के बारे में और जानने के लिए प्रयास कर रहा हूं। यहां संदर्भ है:लिनक्स, जीएनयू जीसीसी, एलडी, संस्करण स्क्रिप्ट और ईएलएफ बाइनरी प्रारूप - यह कैसे काम करता है?
- मेरे पास गतिशील पुस्तकालय के दो संस्करण हैं जो इंटरफेस के एक ही सेट का पर्दाफाश करते हैं, libsome1.so
और libsome2.so
कहें।
- एक आवेदन libsome1.so
के खिलाफ जुड़ा हुआ है।
- यह एप्लिकेशन libdl.so
का उपयोग अन्य मॉड्यूल को गतिशील रूप से लोड करने के लिए करता है, libmagic.so
कहें।
- अब libmagic.so
libsome2.so
के खिलाफ जुड़ा हुआ है। जाहिर है, libmagic.so
में प्रतीकों को छिपाने के लिए लिंकर स्क्रिप्ट का उपयोग किए बिना, रन-टाइम पर सभी libsome2.so
में इंटरफेस को कॉल करते हैं libsome1.so
पर हल किए जाते हैं। मैक्रो LIB_VERSION
के मान के विरुद्ध libVersion()
द्वारा लौटाए गए मान की जांच करके इसकी पुष्टि की जा सकती है।
- तो मैं और संकलित करने के लिए अगले एक लिंकर स्क्रिप्ट जो 3 को छोड़कर सभी प्रतीकों जो libmagic.so
में परिभाषित कर रहे हैं और इसके द्वारा निर्यात किया जाता है खाल के साथ लिंक libmagic.so
प्रयास करें। यह काम करता है ... या कम से कम libVersion()
और LIB_VERSION
मूल्य मिलान (और यह संस्करण 2 को रिपोर्ट नहीं करता है)।
- हालांकि, जब कुछ डेटा संरचनाओं को डिस्क पर क्रमबद्ध किया जाता है, तो मैंने कुछ भ्रष्टाचार देखा। एप्लिकेशन की निर्देशिका में यदि मैं libsome1.so
हटाता हूं और libsome2.so
पर इंगित करने के लिए अपनी जगह में एक सॉफ्ट लिंक बना देता हूं, तो सब कुछ अपेक्षित काम करता है और उसी भ्रष्टाचार नहीं होता है।
मैं मदद नहीं कर सकता लेकिन लगता है कि यह रन-टाइम लिंकर के प्रतीकों के संकल्प में कुछ संघर्ष के कारण हो सकता है। मैंने libsome2.so
को जोड़ने का प्रयास करने की कोशिश की है, ताकि सभी प्रतीकों को [email protected]@VER_2
(जिसे मैं अभी भी उलझन में डाल रहा हूं क्योंकि nm -CD libsome2.so
कमांड को symbol
के रूप में सूचीबद्ध करता है और [email protected]@VER_2
नहीं) ... कुछ भी काम नहीं करता !!! मदद!!!!!!
संपादित करें: मुझे पहले इसका उल्लेख करना चाहिए था, लेकिन सवाल में ऐप फ़ायरफ़ॉक्स है, और libsome1.so
libsqlite3.so
इसके साथ भेज दिया गया है। मेरे पास उन्हें पुनः संयोजित करने का विकल्प नहीं है। साथ ही, प्रतीक छिपाने के लिए संस्करण स्क्रिप्ट का उपयोग करना अभी एकमात्र समाधान प्रतीत होता है। तो जब प्रतीकों छुपाए जाते हैं तो वास्तव में क्या होता है? क्या वे एसओ के लिए 'स्थानीय' बन जाते हैं? क्या आरटीएलडी को उनके अस्तित्व का कोई ज्ञान नहीं है? क्या होता है जब एक निर्यातित कार्य एक छिपे प्रतीक को संदर्भित करता है?
क्या आपने http://unix.stackexchange.com/ पर कोशिश की है? – joksnet
@joksnet: मैंने सोचा था कि स्टैकएक्सचेंज उपयोगकर्ताओं के लिए था और डेवलपर्स नहीं ... यह सवाल सी ++ लिनक्स में विकास से संबंधित है ... या क्या मैं बस भ्रमित हूं? :) संपादित करें: मैं गलत हूँ !!! किसी कारण से मैंने सोचा stackexchange = serverfault !! मैं unix.stackexchange.com से अवगत नहीं था !! – themoondothshine
हां! क्योंकि यह अभी भी बीटा पर है, और इसका डोमेन नहीं है। – joksnet