2010-07-29 16 views
6

मेरे पास एक लिनक्स साझा लाइब्रेरी है, foo.so, जिसे dlopen("foo.so", RTLD_NOW | RTLD_LOCAL) का उपयोग करके निष्पादन योग्य से लोड किया गया है। Foo.so से मैं एक और लाइब्रेरी, bar.so, जो foo.so में परिभाषित प्रतीकों को संदर्भित करना चाहता हूं, लेकिन लिंकर उन्हें ढूंढने में विफल रहता है। मैं RTLD_LOCAL को RTLD_GLOBAL में नहीं बदल सकता, क्योंकि मेरे पास लोडिंग करने वाले निष्पादन योग्य स्रोत नहीं है। मैंने सोचा कि -Wl,--export-dynamic foo.so को जोड़ने पर मदद कर सकता है लेकिन यह स्थानीय ध्वज को dlopen पर ओवरराइड नहीं करता है। जीसीसी की नई विशेषता दृश्यता सुविधा ऐसा नहीं लगता है कि यह उत्तर भी प्रदान करता है।दो साझा पुस्तकालयों के साथ dlopen, प्रतीकों का निर्यात

क्या कोई तरीका है कि मैं बार में अनिर्धारित प्रतीकों के संदर्भों को हल करने के लिए लिंकर को निर्देश दे सकता हूं। इसलिए foo.so में उन परिभाषाओं के लिए, -फ्लू या समानता के साथ बार को जोड़ने के बिना प्रतीकों को तीसरी लाइब्रेरी में ले जाकर और दोनों foo को लिंक करना और इसके खिलाफ बार? मेरे लिए जो एकमात्र चीज होती है वह है foo.so के साथ आरटीएलडी_जीएलबीएएल के साथ foo.so खुद के साथ, फिर dlopen bar.so, लेकिन यह मुझे एक गड़बड़ के रूप में हमला करता है। धन्यवाद।

उत्तर

4

foo.sobar.so के विरुद्ध लिंक करें।

जब निष्पादन योग्य dlopen() एस foo.so, bar.so भी लोड किया जाएगा।

वैकल्पिक रूप से, कॉल के लिए झंडे में RTLD_GLOBAL जोड़ने के लिए निष्पादन योग्य बाइनरी-पैच। कोड की तरह

movl $2, 4(%esp)  # $2 == RTLD_NOW; RTLD_LOCAL is 0 
    movl $0xNNNNN, (%esp) # $0xNNNNN == &"foo.so" 
    call dlopen 

यह पैच बजाय movl $0x102, 4(%esp) (RTLD_GLOBAL == 0x100) करने के लिए, और देखा कुछ दिखेगा।

संपादित करें:
आप bar.so का नाम जानते हैं, तो आप foo.so एक "ठूंठ" bar.so के खिलाफ लिंक कर सकते हैं। इससे कोई फर्क नहीं पड़ता कि आपके पास "असली" bar.so नहीं है; यह सब मायने रखता है कि foo.so पर निर्भरता है। रनटाइम पर निर्भरता bar.so को foo.so लोड होने पर लोड होने का कारण बनती है।

+0

उत्तर के लिए धन्यवाद। मैं bar.so के खिलाफ foo.so को लिंक नहीं कर सकता। इसलिए क्योंकि bar.so उपयोगकर्ता द्वारा प्रदत्त प्लग-इन होगा। मैं निष्पादन योग्य पैच भी नहीं कर सकता क्योंकि यह आमतौर पर ग्राहक के सिस्टम पर रूट-स्वामित्व वाला होगा और मुझे यकीन नहीं है कि पैचिंग यह उनके साथ बहुत अच्छी तरह से नीचे जायेगी, यह इंस्टॉलेशन प्रक्रिया को थोड़ा जटिल बनाती है। यह अन्य पुस्तकालयों को भी तोड़ देगा कि निष्पादन खुल रहा है, उनमें से कुछ RTLD_LOCAL पर भरोसा करते हैं। मुझे लगता है कि मुझे खुद को हैक से dlopen foo.so के साथ जाना होगा, ऐसा लगता है कि यह काम करता है। चियर्स –

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