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;