2010-02-16 14 views
30

पर एक साझा lib में निर्यात कार्यों की सूची कैसे मैं सिर्फ Ubuntu पर एक साझा lib का निर्माण किया है, और जब मैं समारोह, आवेदन लोड पुस्तकालय रिपोर्ट कर रहा है उपयोग करने का प्रयास 'xxx' प्रतीक नहीं मिला।उबंटू

मैं अपनी लाइब्रेरी द्वारा निर्यात किए गए कार्यों की जांच (यानी सूची) देखना चाहता हूं ताकि मैं इस मुद्दे की और जांच कर सकूं।

प्रासंगिक विवरण:

ओएस: उबंटू 9.10 संकलक: जीसीसी 4.4.1 लिंकर: जीएनयू ld 2,20

उत्तर

26

एनएम उपयोगिता की कोशिश करो।

जीएनयू एनएम वस्तु फ़ाइलें objfile से प्रतीकों को सूचीबद्ध करता है .... कोई वस्तु फ़ाइलों तर्क के रूप में सूचीबद्ध कर रहे हैं, एनएम फ़ाइल a.out मान लिया गया है। [reference]

+15

** केवल --defined एनएम -सी जी libXXX.so ** के लिए सी ++ –

+0

कि के लिए धन्यवाद। ऐसा प्रतीत होता है मेरे प्रतीक निर्यात किया है, लेकिन अपरिभाषित है (यह एक 'U' समारोह नाम के आगे है)। फ़ंक्शन को कैसे निर्यात किया जा सकता है और फिर भी अपरिभाषित किया जा सकता है (आईआईआरसी, एक लिंकर विकल्प इस प्रकार की अनुपस्थिति को रोकता है)। सबसे महत्वपूर्ण बात यह है कि मैं इसे ठीक करने के लिए क्या कर सकता हूं? –

+0

"यह फिक्सिंग", मेरा मतलब है कि मैं सुनिश्चित कर सकते हैं कि मेरे कार्यों निर्यात किया जाता है और साझा लाइब्रेरी में परिभाषित? –

2

क्या लाइब्रेरी लोड पथ में या एप्लिकेशन के रन-टाइम खोज पथ में आपकी साझा लाइब्रेरी है? ऐसा लगता है जैसे गतिशील लिंकर आपकी लाइब्रेरी नहीं ढूंढ सकता है। यह देखने के लिए कि क्या पुस्तकालय रन-टाइम पर पाया जा सकता है, उदा।:

$ ldd /usr/bin/less 
    linux-gate.so.1 => (0x0072a000) 
    libncurses.so.5 => /lib/libncurses.so.5 (0x00c68000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x007c7000) 
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00286000) 
    /lib/ld-linux.so.2 (0x002a1000) 

पुस्तकालय खोज पथ पर अतिरिक्त जानकारी के लिए ld.so(8) आदमी पृष्ठ देखें।

19
nm -D -C -g <library> 

अच्छी तरह से काम करता है।

+1

में अपरिभाषित के रूप में एक फ़ंक्शन दिखा रहा है _exported_ फ़ंक्शंस के लिए '--defined-only' विकल्प जोड़ें, अन्यथा इस तरह आपको आयात भी मिलेंगे। साथ ही, केवल _functions_ प्राप्त करने के लिए और उदा। की तरह कुछ '_edata', आप' T' या 'दूसरे कॉलम में t' साथ प्रतीकों के लिए दिखना चाहिए। तो, इस तरह कुछ: 'एनएम-डीसीजी - परिभाषित केवल $ MY_LIB | grep '^ [0-9 ए-एफ] \ + [टीटी]' ' – Ruslan