计算机系统篇之链接(5):重定位
Author:stormQ
Wednesday, 15. April 2020 04:35PM
重定位的整体过程
重定位的目的是确定每个符号定义的运行时内存地址,并修改对这些符号的引用,使之指向符号定义的运行时内存地址。
重定位的整体过程可以分为两个步骤:
-
重定位节和符号定义。链接器将输入目标文件的相同节合并成一个节,合并的节将作为可执行目标文件中此类型的节。随后,链接器确定每个合并节的运行时内存地址,并确定合并节中符号定义的运行时内存地址。这一步骤完成后,可执行目标文件中的所有指令和符号定义的运行时内存地址就唯一确定了。
-
重定位节中的符号引用。链接器修改所有的符号引用,使之指向符号定义的运行时内存地址。链接器要执行此步骤依赖于目标文件中的重定位信息。
重定位条目
ELF 中的重定位条目分为两种格式:Rel
和Rela
。每个重定位条目表示一个必须被重定位的符号引用,并指明如何计算被修改的符号引用。重定位条目由汇编器生成。
查看可重定位目标文件中的重定位信息:
$ readelf -r main.o
Relocation section '.rela.text' at offset 0x208 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000005 000b00000002 R_X86_64_PC32 0000000000000000 _Z4funcv - 4
Relocation section '.rela.eh_frame' at offset 0x220 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0
-
注:
-
Offset
是 Relocation Entry 结构体中的第 1 个字段,占用 8 字节,表示需要修改的符号引用的位置。对于可重定位目标文件,该字段表示需要修改的符号引用的起始位置在目标 section (.rela.text
中的重定位条目对应的目标 section 为.text
,.rela.data
中的重定位条目对应的目标 section 为.data
,以此类推)中的偏移量(字节)。对于可执行目标文件和可共享目标文件,该字段表示需要修改的符号引用的起始位置所对应的虚拟内存地址。 -
Info
是 Relocation Entry 结构体中的第 2 个字段,占用 8 字节,表示符号表索引和重定位类型(符号表索引占用高 32 位,重定位类型占用低 32 位)。符号表索引表示需要修改的符号引用在
.symtab
section中的索引。这里的Sym. Value
和Sym. Name
列只是打印了所对应符号表条目中Value
和Name
-