程序员的自我修养-笔记

一、

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”数据段的重定位表。重定位入口 + 偏移就能找到。

你可能感兴趣的:(计算机体系知识,c语言,c++)