重定位是一种用符号定义连接符号引用的过程。可重定位文件必须拥有描述如何去修改它们section contents的信息,好让
可执行或共享目标文件保存程序镜像的正确信息。可重定位条目就是这些数据。
重定位结构不需要附加信息:
typedef struct {
Elf32_Addr r_offset;
uint32_t r_info;
} Elf32_Rel;
typedef struct {
Elf64_Addr r_offset;
uint64_t r_info;
} Elf64_Rel;
重定位结构需要附加信息:
typedef struct {
Elf32_Addr r_offset;
uint32_t r_info;
int32_t r_addend;
} Elf32_Rela;
typedef struct {
Elf64_Addr r_offset;
uint64_t r_info;
int64_t r_addend;
} Elf64_Rela;
r_offset 保存的是应用重定位操作的偏移量。对于一个重定位文件,这个值是从节开始到受重定位影响的存储单元
的偏移量。对于一个可执行或共享目标文件,这个值是受重定位影响的存储单元的虚拟地址。
r_info This member gives both the symbol table index with respect to which the relocation must be
made and the type of relocation to apply. 可重定位类型是处理器特性决定的。当text引用了一个
重定位条目的重定位类型或者符号表索引的时候,这意味着the result of applying ELF[32|64]_R_TYPE
or ELF[32|64]_R_SYM,分别地,to the entry's r_info member.
r_addend 指定了一个附加的常数用来去计算保存在重定位位置的值。