x64: 重定位类型
下表中列出的重定位是针对 x64 定义的。
表 12-19 x64: ELF 重定位类型
|
|
|
|
R_AMD64_NONE
|
0
|
无
|
无
|
R_AMD64_64
|
1
|
word64
|
S + A
|
R_AMD64_PC32
|
2
|
word32
|
S + A - P
|
R_AMD64_GOT32
|
3
|
word32
|
G + A
|
R_AMD64_PLT32
|
4
|
word32
|
L + A - P
|
R_AMD64_COPY
|
5
|
无
|
请参阅此表后面的说明。
|
R_AMD64_GLOB_DAT
|
6
|
word64
|
S
|
R_AMD64_JUMP_SLOT
|
7
|
word64
|
S
|
R_AMD64_RELATIVE
|
8
|
word64
|
B + A
|
R_AMD64_GOTPCREL
|
9
|
word32
|
G + GOT + A - P
|
R_AMD64_32
|
10
|
word32
|
S + A
|
R_AMD64_32S
|
11
|
word32
|
S + A
|
R_AMD64_16
|
12
|
word16
|
S + A
|
R_AMD64_PC16
|
13
|
word16
|
S + A - P
|
R_AMD64_8
|
14
|
word8
|
S + A
|
R_AMD64_PC8
|
15
|
word8
|
S + A - P
|
R_AMD64_PC64
|
24
|
word64
|
S + A - P
|
R_AMD64_GOTOFF64
|
25
|
word64
|
S + A - GOT
|
R_AMD64_GOTPC32
|
26
|
word32
|
GOT + A + P
|
R_AMD64_SIZE32
|
32
|
word32
|
Z + A
|
R_AMD64_SIZE64
|
33
|
word64
|
Z + A
|
|
大多数重定位类型的特殊语义与用于 x86 的语义相同。一些重定位类型的语义不只是简单的计算:
- R_AMD64_GOTPCREL
-
此重定位类型具有与 R_AMD64_GOT32 或等效 R_386_GOTPC 重定位类型不同的语义。x64 体系结构提供了相对于指令指针的寻址模式。因此,可以使用单个指令从 GOT 装入地址。
针对 R_AMD64_GOTPCREL 重定位类型进行的计算提供了 GOT 中指定了符号地址的位置与应用重定位的位置之间的差值。
- R_AMD64_32
-
计算出的值会截断为 32 位。链接编辑器可验证为重定位生成的值是否会使用零扩展为初始的 64 位值。
- R_AMD64_32S
-
计算出的值会截断为 32 位。链接编辑器可验证为重定位生成的值是否会使用符号扩展为初始的 64 位值。
- R_AMD64_8、R_AMD64_16、R_AMD64_PC16 和 R_AMD64_PC8
-
这些重定位类型不适用于 x64 ABI,在此列出是为了说明。R_AMD64_8 重定位类型会将计算出的值截断为 8 位。R_AMD64_16 重定位类型会将所计算的值截断为 16 位。