整个链接过程就是,就是将几个目标文件加工合并成一个实处文件
按序叠加:这季节将各个目标文件依次合并,但是这样会导致效率低下,导致输出文件将会有很多零散的段,因为每个段都需要有一定的地址和空间对齐的要求,段的装载地址和空间的对齐的单位是页,也就是4096字节,那么也就是说如果一个段只有1字节,他也要在内存中占用4096字节,这样会造成内存空间的大量的内部碎片
相似段合并:将相似性质的段进行合并
.bss段在目标文件和可执行文件中并不占用文件的空间,但是它在装载程序占用地址空间
整体链接过程分为两步:
第一步:空间与地址分配
扫描所有的输入目标文件,获得它们的各个段的长度,属性和位置,并且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局的符号表,这一步中,链接器将能够获得所有输入目标文件的段长度,并且将他们合并,计算出输出文件中各个段合并后的长度和位置
第二步:符号解析和重定位
使用上面第一步中收集到的所有信息,读取输入文件中断的数据,重定位信息,并且进行符号解析与重定位,调整代码中的地址
在链接之前,目标文件中的所有段的VMA(virtual memory Address)都为0,因为虚拟地址空间还没有被分配
在Linux下,ELF可执行文件默认地址从0x08048000开始分配