You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找gcc -finstrument-functions插装的所有函数地址?解决dladdr匹配失败问题

解决dladdr无法匹配插装库函数地址的问题

当-finstrument-functions插装到系统库函数(如memset)时,dladdr匹配失败、objdump -t看不到对应符号的核心原因是:这些函数属于动态链接库(如libc.so),而objdump -t默认只显示可执行文件自身的静态符号表,不包含动态链接进来的库符号。以下是具体解决方法:

  • 查看动态符号表而非静态符号表
    用objdump -T 你的可执行文件(大写T参数)或者nm -D 你的可执行文件,这两个命令会显示程序动态链接的所有符号,包括来自libc等系统库的函数地址与名称映射。

  • 直接查询系统库的符号表
    先通过ldd 你的可执行文件找到程序依赖的libc路径(比如/lib/x86_64-linux-gnu/libc.so.6),然后对该库文件执行nm -D /path/to/libc.so.6 | grep memset,就能直接看到memset的地址和符号名。

  • 在代码中自动遍历动态库符号
    如果需要在插装函数里自动解析地址,可使用dl_iterate_phdr遍历当前进程加载的所有共享库,对每个库调用dlinfo获取其符号表信息,或者手动解析ELF文件的符号表结构,匹配目标地址对应的符号名。这种方法能覆盖所有加载的动态库,无需提前知道库路径。

  • 避免误删动态符号
    确保编译后的可执行文件没有被strip工具处理(或不要使用-s编译参数),否则会移除动态符号表,导致上述工具和方法都无法获取符号信息。

内容的提问来源于stack exchange,提问作者Lolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:05:03