2008-12-02 14 views
8

से साझा ऑब्जेक्ट में प्रतीक छुपाएं। मेरे पास दो तृतीय-पक्ष पुस्तकालयों में कभी-कभी समान प्रतीक नाम निर्यात होता है। जब निष्पादन योग्य लोड होता है, ld आमतौर पर गलत चुनता है और परिणामस्वरूप क्रैश हो रहा है। मैं इन पुस्तकालयों की सामग्री के बारे में बहुत कुछ नहीं कर सकता, इसलिए ld को उचित अनुकरण कैसे प्राप्त करें, निर्देश देने का कोई तरीका हो सकता है?एलडी

ओएस - Solaris 10, मेरे कार्यक्रम autoconf/autotools/जीसीसी द्वारा बनाया गया है, परस्पर विरोधी पुस्तकालयों libclntsh और OpenLDAP (Oracle चालक का हिस्सा) कर रहे हैं। असुविधाजनक रूप से, मैं ओरेकल के एलडीएपी क्लाइंट के कार्यान्वयन का उपयोग नहीं कर सकता - इसमें ओपनएलडीएपी की कई विशेषताएं हैं।

संपादित: लिंकेज निम्नलिखित है: libclntsh.so-> A.so-> मुख्य < -B.so < -libldap_r.so

+0

हाय दिमित्री। [मेरा प्रश्न] देखें (http://stackoverflow.com/questions/9909528/how-can-i-remove-a-symbol-from-a-shared-object)। जाहिर है, आप साझा ऑब्जेक्ट के प्रतीकों को हटाने के लिए ['objcopy -N foo'] (http://linux.about.com/library/cmd/blcmdl1_objcopy.htm) का उपयोग कर सकते हैं। –

उत्तर

10

आप में दोनों साझा पुस्तकालयों में लिंक करने के लिए की जरूरत नहीं है संकलित समय (जो आपके प्रश्न से स्पष्ट नहीं है), आप साझा लाइब्रेरी के लिए -Bdirect का उपयोग कर सकते हैं। यह साझा लाइब्रेरी के सभी प्रतीकों के लिए रिकॉर्ड करेगा जहां वे पाए गए थे; यदि फिर रन-टाइम पर प्रतीक की दूसरी परिभाषा प्रकट होती है (अन्य साझा लाइब्रेरी से), इसे अनदेखा कर दिया जाएगा।

4

एक समाधान लाइब्रेरी में LD_PRELOAD पर्यावरण चर सेट करना है जिसका प्रतीक प्राथमिकता लेना चाहिए। (यदि उस लाइब्रेरी ने अपनी लाइब्रेरी निर्भरताओं को साझा किया है, तो आपको इसकी सभी निर्भरताओं को प्रीलोड करना पड़ सकता है; केवल LD_PRELOAD को निर्भर पुस्तकालयों की सूची में रिक्त स्थान से अलग करें।)

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