Gdb 如何知道特定函数在哪个库中定义?
Gdb 如何知道特定函数在哪个库中定义?,gdb,objdump,Gdb,Objdump,(gdb)disas freeaddrinfo 函数freeaddrinfo的汇编程序代码转储: 0x00000037aa4baf10:推送%rbp 0x00000037aa4baf11:推送%rbx 0x00000037aa4baf12:mov%rdi,%rbx 所以我知道freeaddrinfo是一个动态链接的函数,但是如何知道哪个。那么是在中定义的呢?请参见此。info符号freeadrinfo是一种查找方法 在Linux和Solaris上,您还可以使用ldd和LD\u DEBUG=sy
(gdb)disas freeaddrinfo
函数freeaddrinfo的汇编程序代码转储:
0x00000037aa4baf10:推送%rbp
0x00000037aa4baf11:推送%rbx
0x00000037aa4baf12:mov%rdi,%rbx
所以我知道freeaddrinfo
是一个动态链接的函数,但是如何知道哪个。那么是在中定义的呢?请参见此。info符号freeadrinfo
是一种查找方法
在Linux和Solaris上,您还可以使用ldd
和LD\u DEBUG=symbols
。例如,如果您想找出/bin/date
中localtime
的来源:
(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
在libraries目录中,您可以执行以下命令来搜索所有库上的特定符号:
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]
一个增强的版本是列出链接到可执行文件的所有库(通过ldd),如果在其中定义了符号,则搜索列出的每个库。根据您的*nix,您可能需要调整切割解析:
对于某些低版本的gdb,“info symbol”无法按照您的要求工作
因此,请使用以下方法:
运行“p symbol\u name”获取符号地址
(gdb)p测试
$1={}0x84bcc4
检查/proc/PID/maps以找出符号地址所在的模块
#更多信息/proc/23275/maps
007ce000-0085f000 r-xp 00000000 fd:00 3524598/usr/lib/libtest.so
0x84bcc4在[007CE0000085F000]中
如果您使用“nm-A”,您的第一个版本可以大大减少。美元(ls-1*.so)完全是假的-*。所以也可以。你真的需要重新审视你的问题并接受一些答案。这太棒了。非常感谢!
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]
for file in $(ls -1 *.so); do echo "-------> $file"; nm $file; done | c++filt | grep SYMBOL*
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;