我正在尝试追踪少数用户报告的问题。我目前无法重现它,但我怀疑这个问题与使用PIC和内联汇编有关。
PIC使用全局偏移表(GOT),内联汇编必须根据ABI保留EBX
和RBX
。我已审核了代码,似乎会根据需要保留EBX
和RBX
。但这并不意味着生成的代码与预期一致,因为GCC会在其认为合适的情况下交错指令。所有GCC保证都是连续的(即我的ASM不会被重新排序)。
我想使用类似于以下代码来调试调试版本:
volatile void* got1 = GlobalOffsetTablePointer();
// Call a routine that uses inline assembly
volatile void* got2 = GlobalOffsetTablePointer();
assert(got1 = got2);
我遇到的问题是我无法找到函数GlobalOffsetTablePointer
。我已经怀疑与内联汇编的错误交互,所以我试图避免更多的内联汇编来获取GOT指针。
C / C ++中是否提供全局偏移表(GOT)指针?如果是这样,我该如何访问它?