一、
2024-1-21
1、.bss 在目标文件、可执行文件中并不占用空间,但在装载时占用地址空间。链接器将.bss合并时,也分配虚拟空间
2、链接器为目标文件分配地址和空间,.test、.data在可执行文件及装载后的虚拟地址中均占空间;.bss仅在虚拟地址空间中。
3、链接分两步:
- 空间与地址分配:获取各个.o各个段的长度、属性、位置;收集各个.o中的符号定义、符号引用,统一放到全局符号表。计算合并后的各个段长度与位置,并建立映射关系
- 符号解析与重定位:利用第一步的信息,读取各个.o中段的数据,重定位信息。进行符号解析给予重定位,调整代码中的地址。查找全局符号表,找到符号,然后重定位。
4、链接之前,.o的VMA都是0,因为虚拟空间还没有分配。链接之后,可执行文件各个段就分到相应的虚拟地址。(涉及操作系统进行虚拟地址空间分配规则)。链接器在完成地址、空间分配之后,就可以确定所有符号的虚拟地址了,然后就可以对需要重定位的进行地址修正了。
5、可重定位的ELF文件一定有重定位表。代码引用了外部代码、符号,对应.o“.rel.text”代码段的重定位表,“.rel.data”数据段的重定位表。重定位入口 + 偏移就能找到。