2011-04-06 55 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 2011-04-06 20:03:46

回答

8

看到這個answerinfo symbol freeadrinfo是找出答案的一種方法。

在Linux和Solaris上,您還可以使用lddLD_DEBUG=symbols。例如,如果你想找出localtime/bin/date是來自:

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 2011-04-07 01:44:47

+0

太棒了。非常感謝你! – 2014-11-05 11:07:53

0

在裏面你可以執行以下命令庫目錄中搜索特定符號上的所有庫:

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 2011-04-06 14:35:07

+1

如果您使用'nm -A',您的第一個版本可以大大減少。而$(ls -1 * .so)完全是假的 - * .so也可以起作用。 – 2011-04-06 15:38:47

1

對於某些低版本的gdb,「信息符號」不能工作,只要你想。

所以,請使用以下方法:

  1. 運行 'P SYMBOL_NAME' 得到符號地址

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

  2. 檢查/ proc/PID /圖來找出模塊其符號地址在。

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

    0x84bcc4是[007ce000,0085f000]

相關問題