在某些可以使用 PC(RIP) 相对寻址模式引用数据 (mov eg) 和代码 (jmp, call) 的架构(如 x86_64)中,是否真的有技术原因证明需要这种结构(got, plt ) ?
我的意思是,如果我想将全局数据(例如)移动到寄存器中,我可以执行以下指令(标准 PIE):
mov rax,QWORD PTR [rip+0x2009db]
mov eax,DWORD PTR [rax]
(其中 0x2009db 是 rip 和 get 中包含符号地址的正确条目之间的偏移量)
为什么我们不能做这样的事情:
mov rax, 翻录+0xYYYYYY
mov eax,DWORD PTR [rax]
(0xYYYYYYY 是 RIP 值和符号之间的直接增量(例如全局变量))
我不习惯做 ASM,所以我的例子可能是错误的。但我的想法是:为什么不简单地根据 RIP 计算符号的绝对地址,将其放入 EAX,然后访问其内容。如果指令集允许使用相对寻址做任何我们想做的事情,为什么要使用这样的结构 (got, plt) ?
同样的问题也适用于 call/jmp 指令。
是因为指令集不允许吗?是不是因为偏移值不能覆盖整个地址空间?但是..重要吗?由于一个节的结构被维护一个映射到进程的虚拟寻址空间(例如.dat 节后跟.got 或类似的东西)。我的意思是,为什么直接引用符号地址而不是 get 中的入口地址时偏移量会更大?其他原因?
谢谢 !