ELF文件包含两个用于处理重定位的结构:
Elf64_Rel:
typedef struct {
Elf64_Addr r_offset;
Uint64_t
r_info;
} Elf64_Rel;
和Elf64_Rela:
typedef struct {
Elf64_Addr r_offset;
uint64_t
r_info;
int64_t
r_addend;
} Elf64_Rela;
我想看一看重定位条目,但是我不确定要使用哪个重定位条目,手册页对此非常含糊。每种都有特定用法吗?
这取决于目标。大多数目标仅使用两种形式之一。 Relocation(ELF规范)的System V Application Binary Interface一章说:
如前所述,只有
Elf32_Rela
和Elf64_Rela
条目包含显式加数。类型为Elf32_Rel
和Elf64_Rel
的条目在要修改的位置存储一个隐式加数。根据处理器体系结构,一种形式或另一种形式可能是必需的或更方便的。因此,特定机器的实现可以根据上下文使用一种形式,也可以只使用一种形式。
ELF格式是自描述的,它表示是否使用了REL或RELA重定位(节类型为SHT_REL
或SHT_RELA
; DT_REL
,DT_RELSZ
,DT_RELENT
或DT_RELA
,动态部分中的DT_RELASZ
,DT_RELAENT
)。但是重定位处理本身是非常特定于目标的。