为什么';Elf64是否在64位x86上使用Elf64_Rel进行重新定位?

为什么';Elf64是否在64位x86上使用Elf64_Rel进行重新定位?,x86,x86-64,elf,relocation,X86,X86 64,Elf,Relocation,国家: 64位SPARC和64位x86仅使用Elf64_Rela重定位项。因此,r_加数成员用作重定位加数。x86仅使用Elf32_Rel重定位项。要重新定位的字段保存加数 存在一个Elf64_Relstruct,为什么不在64位x86目标上使用它呢?在这里使用Elf64_Rela是否只会浪费空间,因为重新定位前的地址被忽略了(或者从测试中看到,至少总是0) 注:Elf64\u Rel中省略了r\u加数,而不仅仅是未使用 存在Elf64_Rel结构,为什么不在64位x86目标上使用它 在x86_

国家:

64位SPARC和64位x86仅使用Elf64_Rela重定位项。因此,r_加数成员用作重定位加数。x86仅使用Elf32_Rel重定位项。要重新定位的字段保存加数

存在一个
Elf64_Rel
struct,为什么不在64位x86目标上使用它呢?在这里使用
Elf64_Rela
是否只会浪费空间,因为重新定位前的地址被忽略了(或者从测试中看到,至少总是0)

注:
Elf64\u Rel
中省略了
r\u加数
,而不仅仅是未使用

存在Elf64_Rel结构,为什么不在64位x86目标上使用它

在x86_64上,有几种可能的方法。默认情况下,使用,不需要任何64位重定位


如果使用
-mcmodel=large
编译,则将使用64位重定位。

您能否澄清这是如何解释
mov eax、[rel foo+12]
不能使用对象文件中机器代码中的
rel32
来保存
+12
,而不是使用单独保存元数据的重定位类型?它是否试图处理像
mov eax、[rel foo+mage_offset]
这样的情况,其中代码在数组末尾的范围内,但不在
foo
符号本身的范围内,因此rel32字段不够大?@PeterCordes从我可以告诉您的原因来看是正确的。组装
mov-eax,[rel-symbol+0x112233445667788]
给出
8b 05 00 00
,分解为
mov-eax,dword[rip+0x0]
,重定位条目为
2:symbol+0x112233445667784
,显然无法放入rel32。然而,在我看来,汇编程序在可能的情况下却不这么做,这确实很奇怪。我觉得存储一个Elf64_Rela列表和一个单独的Elf64_Rel列表可以节省一些空间。@4naves:是的。很少链接符号+偏移量在范围内(对于rel32或abs32)但符号不在范围内的可执行文件(或库)。这可能只会发生在链接器脚本将一个大数据段放在
.text
之前,也可能发生在手写asm上,该asm利用了
symbol+2G
将在范围内的知识,即使不能假定
symbol
在范围内
gcc-mcmodel=medium
将假定任何大型数组都需要使用64位绝对地址引用。