Hyperlink 什么';在链路(GNU ld)重定位过程中,R_386_PC32和R_X86_64_PC32之间的区别是什么

Hyperlink 什么';在链路(GNU ld)重定位过程中,R_386_PC32和R_X86_64_PC32之间的区别是什么,hyperlink,x86-64,relocation,Hyperlink,X86 64,Relocation,阅读《计算机系统:程序员的视角》一书时,第7.7.1节重新定位条目:本节的简要内容是链接器如何在不同的对象文件中重新定位引用 编译和objdump示例源代码时: void swap(); int buf[2] = {1, 2}; int main() { swap(); return 0; } 然后是gcc-Wall-c-o main.o main.c和objdump-S-r main.o>main.asm;并将看到交换的重新定位条目: 6: e8 fc ff ff ff cal

阅读《计算机系统:程序员的视角》一书时,第7.7.1节重新定位条目:本节的简要内容是链接器如何在不同的对象文件中重新定位引用

编译和objdump示例源代码时:

void swap();
int buf[2] = {1, 2};
int main()
{
  swap();
  return 0;
}
然后是gcc-Wall-c-o main.o main.c和objdump-S-r main.o>main.asm;并将看到交换的重新定位条目:

6: e8 fc ff ff ff    call 7 <main+0x7> swap();
                     7: R_386_PC32 swap relocation entry
调用指令(fc ff)-4的操作数非常适合386指令集

但当我在X86_64 Linux中重复这一点时,我发现调用的代码是:

9: e8 00 00 00 00 callq e <main+0xe>
                  a: R_X86_64_PC32 swap relocation entry
9:e8 00 callq e
a:R_X86_64_PC32交换重新定位条目
那么我的问题是,为什么386中call(e8)的操作数是-4((fc ff ff ff),而X86_64 main.o中的操作数是00?这是因为不同的指令集(call与callq),还是GNU使用不同的算法来重新定位R_X86_64_PC32


希望您能回答,非常感谢。

值不重要,它将在重新定位过程中被覆盖。显然,对于i386,编译器默认指向重新定位项本身,而对于x86-64,它指向下一条指令。无论如何,它只是一个伪值

9: e8 00 00 00 00 callq e <main+0xe>
                  a: R_X86_64_PC32 swap relocation entry