每个源代码模块独立地编译,然后按照需要将它们“组装”起来,这个组装模块的过程就是链接(Linking).链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。
每个模块的源代码文件(如.c)文件经过编译器编译成目标文件(Object File, 一般扩展名为.o或.obj),目标文件和库(Library)一起链接形成最终可执行文件。
前提:在程序模块main.c中使用另外一个模块func.c的函数foo().
使用链接器,你可以直接引用其他模块的函数和全局变量而无须知道它们的地址,因为链接器在链接的时候,会根据你所引用的符号foo, 自动去相应的func.c模块查找foo的地址,然后将main.c模块中所有引用到foo的指令重新修正,让它们的目标地址为真正的foo函数的地址。这就是静态链接的最基本的过程和作用。
链接的接口-符号
链接过程的本质就是要把多个不同的目标文件之间相互“粘”到一起,为了使不同目标文件之间能够相互粘合,这些目标文件之间必须有固定的规则才行。
在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量地址的引用。比如目标文件B要用到了目标文件A中的函数“foo”,那么我们就成目标文件A定义(Define)函数“foo”, 称目标文件B引用(Reference)了目标文件A中的函数“foo”
为了防止类似的符号名冲突,UNIX下的C语言规定,C语言源代码文件中的所有全局变量和函数经过编译以后,相对应的符号名前加上下划线“_”
网友评论