2011-04-06 80 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]

相关问题