1
3
GCC正在使用 相对的 跳转表中的位移(相对于表的底部),而不是绝对地址。 所以跳转台本身是位置独立的,在重新定位时不需要修正, e、 g.作为加载PIE可执行文件或PIC共享库的一部分。
如果你用
像x86-64 Linux这样的目标确实支持运行时数据修正,因此一个简单的跳转表是可能的。但有些目标根本不支持修复,这就是gcc的原因
不幸的是,gcc使用的是跳转表,而不是意识到每种情况之间的唯一区别是数据,而不是代码。所以它实际上只需要一个字符串指针的表查找。(如果需要,可以通过相对位移来实现。) 这是一个单独的遗漏优化,我报告为 bug 85585 (这提醒了我,我有一篇关于那篇写了一半的文章的后续文章,我应该完成并发布。) |
2
1
只需要一个
不
第一次使用它作为表的基础来索引它。该表保存相对于自身的地址,因此将RDX添加到表中的值会创建一个绝对地址。 顺便说一句,这很容易得到改善:
在当前的体系结构上,不能消除自mov,所以最好将其转移到其他寄存器。 |
ZenBa2 · getopt未更改值C 2 年前 |
Waeez · 条件未满足php仍在运行 6 年前 |
Catz · 正在尝试打印正确数量的“*”以代替数值 6 年前 |
privilegedMale · switch语句中的扫描仪问题 6 年前 |
rasilvap · 具有多个参数的开关箱 6 年前 |
RudziankoÅ · 不可能的类型切换情况:不能有动态类型 6 年前 |
Leo Thomas · 循环case语句而不退出shell脚本 6 年前 |