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