链接时候的空间与地址分配
- 按序叠加(这种情况下,因为段的大小不全和页的大小相等(或倍数),所以会完成大量的内存空间的内部碎片)
- 相似段合并(把相同性质的段合并在一起)
在合并段时,.bss段虽然在目标文件和可执行文件中不占文件的空间,但它在装载是占用地址空间,所以也要把它合并。
链接器分配的地址和空间指的是:
- 在输出的可执行文件中的空间
- 在装载后的虚拟地址中的虚拟地址空间(常用)
对于有实际数据的段,在两者中都要分配空间;对于.bss来说,分配空间只是分配虚拟地址空间
相似段合并常采用两步链接的策略
- 第一步,空间与地址分配:扫描所有的输入目标文件,并且将输入目标文件中符号表中所有的符号定义和符号引用收集起来,统一放在一个全局符号表。获得所有输入目标文件的段长度,并且把它们合并,计算出各个段合并后的长度和位置,并建立映射关系。
- 第二步,符号解析和重定位(链接的核心):读取第一步后得到的输入文件中的段的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址等。
链接前后使用的是程序进程中的虚拟地址,所以我们关心的是各个段的虚拟内存空间VMA和大小,而不关心文件的偏移量。
在链接之前,目标文件中的所有段的VMA都是0(因为虚拟空间还没有分配),链接后各个段的起始地址是合并后段的起始地址加偏移量。
段中变量位置的确定:段的起始位置+偏移量
网友评论