2011-01-11 7 views
8

मैं लिनक्स में लाइब्रेरी वर्जनिंग और इसे सब कुछ काम करने के बारे में और जानने के लिए प्रयास कर रहा हूं। यहां संदर्भ है:लिनक्स, जीएनयू जीसीसी, एलडी, संस्करण स्क्रिप्ट और ईएलएफ बाइनरी प्रारूप - यह कैसे काम करता है?

- मेरे पास गतिशील पुस्तकालय के दो संस्करण हैं जो इंटरफेस के एक ही सेट का पर्दाफाश करते हैं, libsome1.so और libsome2.so कहें।

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

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

- अब libmagic.solibsome2.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.solibsqlite3.so इसके साथ भेज दिया गया है। मेरे पास उन्हें पुनः संयोजित करने का विकल्प नहीं है। साथ ही, प्रतीक छिपाने के लिए संस्करण स्क्रिप्ट का उपयोग करना अभी एकमात्र समाधान प्रतीत होता है। तो जब प्रतीकों छुपाए जाते हैं तो वास्तव में क्या होता है? क्या वे एसओ के लिए 'स्थानीय' बन जाते हैं? क्या आरटीएलडी को उनके अस्तित्व का कोई ज्ञान नहीं है? क्या होता है जब एक निर्यातित कार्य एक छिपे प्रतीक को संदर्भित करता है?

+0

क्या आपने http://unix.stackexchange.com/ पर कोशिश की है? – joksnet

+2

@joksnet: मैंने सोचा था कि स्टैकएक्सचेंज उपयोगकर्ताओं के लिए था और डेवलपर्स नहीं ... यह सवाल सी ++ लिनक्स में विकास से संबंधित है ... या क्या मैं बस भ्रमित हूं? :) संपादित करें: मैं गलत हूँ !!! किसी कारण से मैंने सोचा stackexchange = serverfault !! मैं unix.stackexchange.com से अवगत नहीं था !! – themoondothshine

+0

हां! क्योंकि यह अभी भी बीटा पर है, और इसका डोमेन नहीं है। – joksnet

उत्तर

4

कोशिश दोनों libsome1.so और libsome2.so संकलन अपने स्वयं के संस्करण (ld को --version-script विकल्प का उपयोग) के साथ प्रतीक संस्करण, प्रत्येक जोड़ने के लिए। फिर नए पुस्तकालयों का उपयोग करके एप्लिकेशन और libmagic.so लिंक करें। फिर, libsome1.so और libsome2.so पूरी तरह से अलग होना चाहिए।

यदि प्रतीक के विपरीत संदर्भ हैं तो समस्याएं तब भी हो सकती हैं। इस तरह के संदर्भ संस्करण परिभाषाओं से संतुष्ट हो सकते हैं (ताकि बाइनरी संगतता को तोड़ने के बिना पुस्तकालय में प्रतीक संस्करण जोड़ना संभव हो)। यदि एक ही नाम के कई प्रतीक हैं, तो कभी-कभी भविष्यवाणी करना मुश्किल हो सकता है कि किस का उपयोग किया जाएगा।

उपकरण के संबंध में, nm -D प्रतीक संस्करण के बारे में कोई जानकारी प्रदर्शित नहीं करता है। इसके बजाय objdump -T या readelf -s आज़माएं।

+0

जानकारी के लिए धन्यवाद। मैंने कुछ नया सीख लिया! मुझे शायद पहले इसका उल्लेख करना चाहिए था, लेकिन सवाल में ऐप फ़ायरफ़ॉक्स है और 'libsome1.so'' libsqlite3.so' इसके साथ भेज दिया गया है। तो मेरे पास कोई तरीका नहीं है कि मेरे पास उन्हें पुनः संयोजित करने का विकल्प है। हालांकि मैंने स्थिति का मॉडल बनाने के लिए बनाए गए न्यूनतम नमूने पर आपके समाधान का प्रयास किया ... और यह काम किया! – themoondothshine

+0

मुझे कुछ नया सिखाने के लिए आपके उत्तर में +1! – themoondothshine

+0

मैं आपको बक्षीस दे रहा हूं। मुझे लगता है कि यह अच्छी तरह से योग्य है; आपका जवाब अच्छा है। कुछ और प्रतिनिधि है! –

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