R_386_32 和 R_X86_64_64 计算逻辑的区别

Difference between the calculation logic for R_386_32 and R_X86_64_64

据我所知,两种方式的重定位计算是相同的,即:S + A,但是R_386_32,这里的“A”代表固定内存位置上的存储值。而R_X86_64_64代表的是对应符号上的加数,这样理解对吗?

重定位计算方式S+A对32位和64位模式均有效。这个A表示两个实体的总和:

  1. 编译器插入到作为重定位对象的内存单元(DWORD ior QWORD)的值,
  2. 搬迁记录的附加字段R_386_32R_X86_64_64

创建 ELF64 的编译器和汇编器更喜欢带有显式加数的重定位记录,在 ELF 部分 .rela.name.

中发出

当他们生产 ELF32 时,他们在 ELF 部分 .rel.name 中发出没有加数的重定位。加数需要在编译时加入到重定位的内存单元中。
生成 COFF 目标文件时使用相同的原理(重定位记录中没有附加值),无论是 32 位还是 64 位变体。

BTW GNU linker ld 似乎不接受 ELF32 对象模块中带有加数的 .rela 记录。我尝试 link 我手工制作的带有显式加数的 ELF32 模块,但它们被忽略了,尽管 Elf32_RelElf32_Rela 结构在 ELF specification.

中声明