从ELF查找源文件功能声明位置

时间:2018-11-29 17:03:17

标签: gcc elf decompiler

给出一个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。

1 个答案:

答案 0 :(得分:1)

  

有了此输出中的信息,我能否在源文件中找到调用该glob符号的位置?

否。

您可以执行以下操作:objdump -d bin/my_app,在CALL的两个版本中找到glob,然后 会告诉您调用来自什么功能

  

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

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

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