为什么需要链接
在实际开发中,我们一定是多文件编程,所有文件在编译后,需要合在一起,合在一起的过程就是链接的过程。
每一个源文件(就是.c文件,上图中的程序1)都有对应的零碎文件(就是.h文件),通过预编译(通过#include实现)把.c和.h文件整合成一个组合C文件,这个组合C文件的扩展名为.i。把组合C文件编译成汇编文件.s,目标文件为机器指令(放在一个.o文件当中),单个目标文件是不能工作的,因为各个目标文件是相互支撑工作的。
把各个目标文件整合的过程就叫链接过程。整合后的文件就叫可执行程序,windows后缀为.exe,Linux后缀为.out
链接过程都干了什么事
目标文件主要分为两个区域:数据区域和指令区域。 每一个指令和数据都被安排了地址。
(1)目标文件被整合的时候,每个目标文件的数据区被整合到一起,每个目标文件的指令区被整合到一起。假如目标文件1被整合前指令的地址是00000001,目标文件n整合前指令的地址也是00000001,整合到一起后,他们的地址是要重新编排的,这个叫地址重定位。数据区域的地址相应的也要重新编排。