【发布时间】:2016-06-15 14:10:59
【问题描述】:
我正在维护JIT compiler for the virtual machine in ioquake3。
最近有人尝试从 ioquake3 构建 PIE 二进制文件,但是编译后的代码大量使用了 PIC 代码中的 EBX 寄存器,因此 PIE 二进制文件似乎是一个包含 GOT 地址的固定寄存器。
虚拟机可能会在固定点调用 GCC 编译的代码,因此我需要将 EBX 恢复到 GOT 地址。 为此,JIT 编译器代码需要知道 GOT 地址,以便它可以发出将 EBX 恢复到该地址的代码。 我想你可以像这样直接使用内联汇编:
void *gotptr;
__asm__ volatile("\n": "=b" (gotptr));
编译后的代码直接从 JIT 编译器代码中调用,因此 EBX 在 JIT 编译和调用 VM 时应该是相同的。我的问题是:这行得通吗,是否有不同的方法从 C 代码中检索 GOT 地址,例如,是否定义了指定该地址的符号,或者是否有返回它的函数?
【问题讨论】:
-
您不需要恢复 EBX。 PIC 编译函数应该在设置它的函数的开头有一些东西。 (例如,致电
__x86.get_pc_thunk.bx)。 -
天哪,你是对的。我想这是有道理的,因为每个 PIC 对象都有自己的符号表。如果您添加答案,我会接受。
标签: c assembly x86 inline-assembly fpic