2011-04-06 13 views
10
[[email protected] memcached-1.4.5]# objdump -R memcached-debug |grep freeaddrinfo 
0000000000629e10 R_X86_64_JUMP_SLOT freeaddrinfo 

...कैसे पता चलेगा कि कौन सी लाइब्रेरी में एक विशिष्ट फ़ंक्शन परिभाषित किया गया है?

(gdb) disas freeaddrinfo 
Dump of assembler code for function freeaddrinfo: 
0x00000037aa4baf10 <freeaddrinfo+0>: push %rbp 
0x00000037aa4baf11 <freeaddrinfo+1>: push %rbx 
0x00000037aa4baf12 <freeaddrinfo+2>: mov %rdi,%rbx 

तो मैं जानता हूँ कि freeaddrinfo एक गतिशील रूप से जुड़े हुए समारोह है, लेकिन कैसे पता करने के लिए जो .so उस में परिभाषित किया गया है?

+0

आप गंभीरता से कुछ जवाब आपके प्रश्नों की समीक्षा करने और स्वीकार करने की जरूरत है। – karlphillip

उत्तर

8

यह answer देखें। info symbol freeadrinfo पता लगाने का एक तरीका है।

लिनक्स और सोलारिस पर आप ldd और LD_DEBUG=symbols का भी उपयोग कर सकते हैं।

LD_DEBUG=bindings ldd -r /bin/date 2>&1 | grep localtime 
    26322: binding file /bin/date [0] to /lib/libc.so.6 [0]: normal symbol `localtime' [GLIBC_2.2.5] 
+0

क्या आप इस आदेश को कैसे काम करते हैं, इस बारे में अधिक विस्तार से बता सकते हैं? – compiler

+0

यह कमाल है। इसके लिए आपको बहुत धन्यवाद! –

0

पुस्तकालयों निर्देशिका आप निम्न आदेश पर अमल कर सकता है अंदर सभी पुस्तकालयों पर एक विशेष प्रतीक के लिए खोज करने के लिए: उदाहरण के लिए, यदि आप पता लगाना चाहते थे जहां /bin/date में localtime से आ रही है

for file in $(ls -1 *.so); do echo "-------> $file"; nm $file; done | c++filt | grep SYMBOL* 

एक उन्नत संस्करण निष्पादन योग्य (ldd) से जुड़े सभी पुस्तकालयों को सूचीबद्ध करना होगा और प्रतीक को परिभाषित किए जाने पर प्रत्येक लाइब्रेरी सूचीबद्ध खोज के बाद जाना होगा। अपने * nix के आधार पर आप बदलाव करने कटौती पार्स हो सकता है:

APP=firefox; for symbol in $(nm -D $APP | grep "U " | cut -b12-); do for library in $(ldd $APP | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done; 
+0

बेहतर उत्तर। – karlphillip

+1

यदि आप 'एनएम-ए' का उपयोग करते हैं तो आपका पहला संस्करण बहुत कम हो सकता है। और $ (एलएस -1 * एसएसओ) पूरी तरह से फर्जी है - *। तो बस भी काम करता। –

1

कुछ कम संस्करण gdb के लिए, "जानकारी प्रतीक" काम नहीं कर सकता है आप चाहते हैं।

तो विधि नीचे का उपयोग करें:

  1. भागो 'पी symbol_name' पाने के लिए प्रतीक का पता

    (gdb) p test_fun $1 = {<text variable, no debug info>} 0x84bcc4 <test_fun>

  2. चेक/proc/पीआईडी ​​/नक्शे बाहर मॉड्यूल को खोजने के लिए जो प्रतीक पता है।

    # more /proc/23275/maps 007ce000-0085f000 r-xp 00000000 fd:00 3524598 /usr/lib/libtest.so

    0x84bcc4 में [007ce000, 0085f000]

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

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