【问题标题】:How to know which library a specific function is defined in?如何知道特定函数定义在哪个库中?
【发布时间】:2011-04-06 08:17:09
【问题描述】:
[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 中呢?

【问题讨论】:

  • 你真的需要检查你的问题并接受一些答案。

标签: gdb objdump


【解决方案1】:

看到这个answer。 info symbol freeadrinfo 是找出答案的一种方式。

在 Linux 和 Solaris 上,您还可以使用 ldd 和 LD_DEBUG=symbols。例如,如果您想找出/bin/date 中的localtime 来自哪里:

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]

【讨论】:

  • 太棒了。非常感谢您!
【解决方案2】:

对于某些低版本的gdb,“信息符号”无法正常工作。

所以请使用以下方法:

  1. 运行 'p symbol_name' 获取符号地址

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

  2. 查看/proc/PID/maps,找出符号地址所在的模块。

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

    0x84bcc4 在 [007ce000, 0085f000]

【讨论】:

    【解决方案3】:

    在库目录中,您可以执行以下命令在所有库中搜索特定符号:

    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;
    

    【讨论】:

    • 如果你使用'nm -A',你的第一个版本可以大大减少。而且 $(ls -1 *.so) 完全是假的——*.so 也可以。
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多