[root@xxx 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 :(得分:8)
见answer。 info symbol freeadrinfo
是找出问题的一种方法。
在Linux和Solaris上,您还可以使用ldd
和LD_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]
答案 1 :(得分:2)
对于某些低版本gdb,&#34;信息符号&#34;无法按你的意愿工作。
所以请使用以下方法:
运行&#39; p symbol_name&#39;得到符号地址
(gdb) p test_fun
$1 = {<text variable, no debug info>} 0x84bcc4 <test_fun>
检查/ proc / PID / maps以找出符号地址所在的模块。
# more /proc/23275/maps
007ce000-0085f000 r-xp 00000000 fd:00 3524598 /usr/lib/libtest.so
0x84bcc4在[007ce000,0085f000]
答案 2 :(得分:0)
在libraries目录中,您可以执行以下命令来搜索所有库上的特定符号:
for file in $(ls -1 *.so); do echo "-------> $file"; nm $file; done | c++filt | grep SYMBOL*
增强版本将列出链接到可执行文件的所有库(通过 ldd ),并在列出的每个库之后搜索是否在那里定义了符号。根据您的* nix,您可能需要调整 cut 解析:
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;