2010-12-08 13 views
6

मैं निम्नलिखित त्रुटि मिलती है जब मैं एक स्क्रिप्ट के लिए मैं केवल निष्पादन उपयोग कर सकते है चलाने का प्रयास: इस के बाद किया जाता है मैं LD_PRELOAD वातावरण की स्थापना की हैLD_PRELOAD के लिए मेरे lib स्थापना बनाता है कुछ प्रक्रियाओं लोडर त्रुटियां उत्पन्न

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

परिवर्तनीय /home/dumindara/random/sotest/a.out

a.out में एक परीक्षण malloc फ़ंक्शन है, और आंतरिक रूप से dlsym पर कॉल करता है।

ls चलाते समय मुझे यह समस्या नहीं आती है। अधिकांश प्रक्रियाएं इस त्रुटि को देती हैं। ऐसा क्यों होता है और मैं इसे काम करने के लिए क्या कर सकता हूं?

+0

यह आम तौर पर एक अच्छी बात है शैल पर्यावरण को संशोधित करने के बजाय, केवल a.out के लिए LD_PRELOAD सेट करने का विचार। अधिकांश यूनिक्स शैल में आप टाइप कर सकते हैं: 'LD_PRELOAD = xyz।/A.out'। अन्यथा, '(LD_PRELOAD = xyz; ./a.out)' आज़माएं। –

+0

@ टोनी: मुझे लगता है कि इस मामले में एक बीमार चुना गया नाम होने के बावजूद a.out एक साझा वस्तु है। ओपी स्पष्ट रूप से 'malloc()' को अपने स्वयं के संस्करण के साथ ओवरराइड करने का प्रयास कर रहा है और फिर वास्तविक मॉलोक में पास-थ्रू कर रहा है। – thkala

+0

@khkhala: आह, अच्छा पकड़ ... 'LD_PRELOAD = \' pwd \ '/a.out program_to_test' की तरह अधिक होगा .... –

उत्तर

13

मुझे लगता है कि अपने a.out फ़ाइल एक साझा वस्तु और नहीं एक निष्पादन योग्य है और आगे बढ़ने ...

dlsym() libdl पुस्तकालय, जो आमतौर पर libdl.so.2 साझा में रहता है से एक समारोह है आधुनिक लिनक्स सिस्टम पर वस्तु।

मैं अनुमान लगाऊंगा कि आपका a.out साझा ऑब्जेक्ट libdl से जुड़ा नहीं है। इसका मतलब यह है कि जब आप एक समान बाइनरी में एक जैसे बाइनरी में प्रीलोड करते हैं जो कई अन्य पुस्तकालयों में नहीं खींचता है, libdl.so.2 को खींचा नहीं जा सकता है और आपको एक अपरिभाषित प्रतीक त्रुटि मिलती है।

यदि दूसरी तरफ, आप इसे एक बाइनरी से प्रीलोड करते हैं जो अंततः libdl.so.2 में खींचता है, तो आपकी साझा वस्तु ठीक काम करती है।

मैं ldd के साथ जांच करूँगा यदि आपकी खुद की साझा वस्तु libdl के खिलाफ जुड़ी हुई है, और uname और ls रन पर पुस्तकालय सीधे या अप्रत्यक्ष रूप से खींचे जाते हैं।

संपादित करें:

मैं सिर्फ इस बात की पुष्टि की। इस त्रुटि को ठीक करने का तरीका libdl के विरुद्ध आपके साझा ऑब्जेक्ट को लिंक करना है। -ldl को अपने एलडीएफएलजीएस में जोड़ने से चाल चलनी चाहिए।

+0

ध्यान दें कि -ldl को अन्य .o फ़ाइलों से पहले होने की आवश्यकता हो सकती है, जैसे"gcc -ldl -shared foo.o bar.o -o baz.so"। –

16

मैं स्वीकार्य उत्तर पर टिप्पणी करने में असमर्थ हूं, हालांकि यहां उल्लेख करना उचित है कि libdl.so.2 को ठीक से लिंक नहीं किया जा सकता है जब -ldl संकलन कमांड के सामने उपयोग किया जाता है (यह मानते हुए कि लिंकिंग और संकलन एक ही कमांड द्वारा निष्पादित किया जाता है; यह संभव है क्योंकि एलडी_PRELOAD libs आमतौर पर एक स्रोत फ़ाइल पर आधारित होते हैं)।

तो अंत में -ldl साथ जीसीसी फोन:

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

मेरे मामले में, मोर्चे पर -ldl होने ही प्रश्न में के रूप में त्रुटि हुई:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

+0

बहुत महत्वपूर्ण बात .. – user1173339

+0

हाँ अंगूठे ऊपर !!! thkala जवाब अभी भी मुझे त्रुटि दी, लेकिन अंत में अपने "-ldl" सब कुछ हल किया। –

+0

धन्यवाद! यह मेरे लिए काम किया! –