静态链接
对于整个链接器来讲,它的工作就是将几个目标输入文件加工后合并成一个输出文件。
链接器如何将它们的各个段合并到输出文件?
- 按序叠加。但是直接将输入文件叠加。
- 相似段合并。将相同性质的段合并到一起。
链接采用相似段合并。链接的步骤分两步:

第一步:合并+分配虚拟地址空间。
 
在链接之前,所有的段的虚拟地址都是0,因为虚拟空间还没有被分配,等到链接之后,可执行文件的各个段都分配到了相应的虚拟地址空间。
经过扫描和空间分配(空间分配的时候肯定是以segment 而不是 以 section),这时候输入文件中的各个段在链接后的虚拟地址就已经确定。当前面一步完成之后,链接器开始计算各个符号的虚拟地址。因为各个符号在段内的相对位置是固定的,所以这时候链接器须要给每个符号加上一个偏移量,使它们能够调整到正确的虚拟地址。这个时候就确定了所有的符号位置。
第二步:符号解析+重定位
在编译后,链接前,对于不在该编译单元符号的地址用一些暂时的地址代替,在链接完成空间分配后,就已经知道了所有符号的位置,然后再将需要重定位的符号进行重定位。
如何做到重定位?重定位表
对于每个要重定位的段都有一个对应的重定位表。若.text需要重定位,则会存在一个.real.text文件,也就是一个重定位段。
引用到外部地址的地方是需要重定位的地方,称为一个重定位入口。重定位入口的偏移,即该入口在要重定位段的位置。
 
 
重定位过程也伴随着符号的解析过程,每个目标文件都可能定义一些符号,也可能引用到定义在其他目标文件的符号。重定位的过程中,每个重定位的入口都是对一个符号的引用,那么当链接器须要对某个符号的引用进行重定位时,它就要确定这个符号的目标地址。这时候链接器就会去查找由所有输入目标文件的符号表组成的全局符号表,找到相应的符号后进行重定位。
重定位就是修正外部引用的符号地址,修正地址分两种:绝对寻址修正和相对寻址修正。两者区别就是绝对寻址修正后的地址为该符号的实际地址,相对寻址修正后的地址为符号距离被修正位置的地址差。
一个静态库可以看成一组目标文件的集合
大道至简:静态链接,从库中找到对应的文件进行连接。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号