【问题标题】:Address of global symbol table (GOT) in PIC/PIE binariesPIC/PIE 二进制文件中全局符号表 (GOT) 的地址
【发布时间】: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


【解决方案1】:

System V i386 ABI 中,它负责在必要时调用函数来设置 EBX,因此在调用 PIC/PIE 编译函数时不需要恢复它。正如 ABI 所述:

位置无关代码使用%ebx 寄存器来保存地址 全局偏移量表。如果一个函数需要全局偏移量 表的地址,直接或间接地,它负责 计算值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2019-12-31
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多