gcc - 从 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 链接到同一个符号。
解决方案
使用此输出中的信息,我可以在源文件中找到调用此 glob 符号的位置吗?
不。
您可以这样做:objdump -d bin/my_app
,找到CALL
s 的两个版本glob
,这将告诉您调用来自哪些函数。
我想找到位置来了解为什么两个不同版本的 GLIBC 链接到同一个符号。
这不是“两个不同版本的 GLIBC”,而是“glob
具有不同 ABI 的两个不同符号”。
我认为不可能在同一个 ELF 二进制文件中引用不同版本的,除非你用指令glob
做一些创造性的符号别名。asm(".symver ...")
一旦您知道哪个函数引用了(旧)glob@GLIBC_2.17
符号,请在定义该函数的文件上运行预处理器,如果该文件中没有,我会感到非常惊讶asm(".symversion...")
。
推荐阅读
- python-3.x - 如何处理包含文件名的python列表的场景以进行比较?
- javascript - 如何在嵌入不和谐机器人中输入多行参数
- java - 玩家角色移动错误 LibGDX RPG
- python - keras预测数据的索引号
- c# - 获取 WPF 中选中复选框的值
- ruby-on-rails - 使用 Ajax 的 Rails number_field
- java - thymeleaf 中针对 @OneToMeny 和 @ManyToOne 类的无尽休眠查询
- python - 如何在斯坦福的 Stanza (StanfordNLP) 中加载文档而不是字符串?
- java - 如何在 java 中使用 Hibernate 在 postgresql 中保存 json 对象?
- python - 数据类型转换问题