【问题标题】:Find Source File Function Declaration Location from ELF从 ELF 中查找源文件函数声明位置
【发布时间】:2018-12-02 11:02:02
【问题描述】:

给定一个 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 链接到同一个符号。

【问题讨论】:

    标签: gcc elf decompiler


    【解决方案1】:

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

    没有。

    你可以这样做:objdump -d bin/my_app,在glob的两个版本中找到CALLs,会告诉你调用来自什么函数。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2021-09-28
      相关资源
      最近更新 更多