gcc - 编译器如何选择哪个“get_pc_thunk”函数来获取当前地址?
问题描述
PIE 二进制文件使用该函数__x86.get_pc_thunk
获取在加载时动态定义的地址。
i) 有时它会调用__x86.get_pc_thunk.ax
.
5ff: e8 24 00 00 00 call 628 <__x86.get_pc_thunk.ax>
604: 05 fc 19 00 00 add $0x19fc,%eax
609: 83 ec 0c sub $0xc,%esp
60c: 8d 90 b0 e6 ff ff lea -0x1950(%eax),%edx
612: 52 push %edx
613: 89 c3 mov %eax,%ebx
615: e8 36 fe ff ff call 450 <printf@plt>
ii) 有时它会调用__x86.get_pc_thunk.bx
.
634: e8 87 fe ff ff call 4c0 <__x86.get_pc_thunk.bx>
639: 81 c3 c7 19 00 00 add $0x19c7,%ebx
63f: 83 ec 0c sub $0xc,%esp
642: 8b 6c 24 20 mov 0x20(%esp),%ebp
646: 8d b3 f0 fe ff ff lea -0x110(%ebx),%esi
64c: e8 cb fd ff ff call 41c <_init>
iii)有时它调用__x86.get_pc_thunk.cx
或有时__x86.get_pc_thunk.dx
。
__x86.get_pc_thunk.bx
我知道和之间的
区别__x86.get_pc_thunk.ax
是寄存器,将返回地址存储在.bx
toEBX
和.ax
to 中EAX
。
然后,我的问题是:
编译器如何在__x86.get_pc_thunk.ax
///中选择使用哪个函数 ?__x86.get_pc_thunk.bx
__x86.get_pc_thunk.cx
__x86.get_pc_thunk.dx
它是在编译时真正随机选择的吗?
或者有什么算法可以选择吗?
解决方案
编译器为它想要使用的任何寄存器选择适当的函数。使用哪个寄存器是编译器为其编译的函数分配寄存器的结果,通常是不可预测的。
推荐阅读
- visual-studio - MFC:Visual Studio 2019 提示无法实例化 ActiveX 控件?
- java - 类中的Java @Autowire 依赖项并在类成员初始化中使用它们
- ansible - Ansible-playbook 搜索错误目录中的角色!如何纠正它?
- json - 将配置绑定到复杂对象
- questdb - 使用 PgWire 时如何解决 QuestDB Java 客户端 EOFException?
- android - 即使在创建新项目后,Git 也总是打开
- object-detection - 训练、验证和测试:每组正负样本的数量
- hl7-fhir - Google fhir 商店更改搜索结果中的查询字符串 下一个链接
- javascript - 在哪里可以找到曲线方程来生成适合绘图曲线的随机种子数据点?
- windows - 在特定目录中启动 Windows 命令提示符