• 当汇编器生成一个目标模块时,它并不知道数据和代码最终将放在内存中的什么位置
  • 它也不知道这个模块引用的任何外部定义的函数或者全局变量的位置
  • 无论何时汇编器遇到对最终位置未知的目标引用,它就会生成一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用
  • 代码的重定位条目放在 .rel.text 中
  • 已初始化数据的重定位条目放在 .rel.data 中

ELF 重定位条目的格式

typedef struct {
    long offset;    /* Offset of the reference to relocate */
    long type:32,   /* Relocation type */
         symbol:32; /* Symbol table index */
    long addend;    /* Constant part of relocation expression */
} Elf64_Rela;
  • offset 是需要被修改的引用的节偏移
  • symbol 标识被修改引用应该指向的符号
  • type 告知链接器如何修改新的引用
  • addend 是一个有符号常数,一些类型的重定位要使用它对被修改引用的值做偏移调整