首页 > 解决方案 > 从 ELF 中查找源文件函数声明位置

问题描述

给定一个 ELF 文件,我运行readelf -sV bin/my_app | grep \ glob它。这将返回:

   205: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.27 (6)
   326: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.17 (2)
   334: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND globfree@GLIBC_2.17 (2)
 21011: 0000000000cd2748     8 OBJECT  LOCAL  DEFAULT   26 global_mask
 21968: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS globals_io.o
 40039: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@@GLIBC_2.27
 46623: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.17
 47377: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND globfree@@GLIBC_2.17

使用此输出中的信息,我可以在源文件中找到调用此 glob 符号的位置吗?我想找到位置以了解为什么两个不同版本的 GLIBC 链接到同一个符号。

标签: gccelfdecompiler

解决方案


使用此输出中的信息,我可以在源文件中找到调用此 glob 符号的位置吗?

不。

您可以这样做:objdump -d bin/my_app,找到CALLs 的两个版本glob将告诉您调用来自哪些函数。

我想找到位置来了解为什么两个不同版本的 GLIBC 链接到同一个符号。

这不是“两个不同版本的 GLIBC”,而是“glob具有不同 ABI 的两个不同符号”。

我认为不可能在同一个 ELF 二进制文件中引用不同版本的,除非你用指令glob做一些创造性的符号别名。asm(".symver ...")一旦您知道哪个函数引用了(旧)glob@GLIBC_2.17符号,请在定义该函数的文件上运行预处理器,如果该文件中没有,我会感到非常惊讶asm(".symversion...")


推荐阅读