ELF文件中的重定位增量 - Elf64_Rel vs Elf64_Rela?

3

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;

我想查看重定位条目,但不确定该使用哪一个。手册对此相当晦涩。每个重定位条目是否有特定的用途?

1个回答

5
这取决于目标。大多数目标只使用两种形式中的一种。《System V应用程序二进制接口》(ELF规范)中的System V Application Binary Interface Relocation章节指出:
如先前所述,只有Elf32_RelaElf64_Rela条目包含显式加数。类型为Elf32_RelElf64_Rel的条目在要修改的位置存储隐式加数。根据处理器架构,可能需要或更方便使用其中一种形式。因此,特定机器的实现可以完全使用一种形式或根据上下文使用任一形式。
ELF格式本身是自描述的,因为它显示了使用REL还是RELA重定位(对于部分类型,SHT_REL或SHT_RELA;在动态部分中,DT_REL、DT_RELSZ、DT_RELENT或DT_RELA、DT_RELASZ、DT_RELAENT)。但是,重定位处理本身非常特定于目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接