链接
是将各种代码和数据部分收集起来并组合成一个单一可执行文件的过程,这个文件可被加载到存储器并执行、链接可以在编译时(源代码被翻译成机器代码时候)、加载时执行,也可以在程序被加载器加载到存储器并执行时,甚至可以执行于运行时,由应用程序来执行。链接早期是手工的,在现在系统中,链接是由叫连接器的程序自动执行;
连接器在软件开发中是个关键的角色,它使的分离编译成为可能;也就是说可以不用整个应用程序统一编译,而是可以分离模块,或者更小的单位进行编译;比如当我们修改一个模块的一个时,只需要简单的重新编译它,并重新链接应用,而不必重新编译其他文件;链接是由连接器默默处理的;
比如在c语言中:一个程序有两个源文件组成,main.c和swap.c。main文件中的main方法中初始化,并调用swap()方法;见下图
利用编译驱动程序 :gcc -02 -g -o p main.c swap.c
其编译过程如下:
1:驱动程序首先运行C预处理器,把源代码main.c翻译成一个ASCII码的中间文件main.i
2: 驱动程序再运行C的编译器,将main.i文件翻译成一个ASCII汇编语言文件main.s
3:然后驱动器运行汇编器,它将main.s翻译成一个可重定位文件main.o
4:驱动程序用同样的方法编译swap.c文件成swap.o
5:驱动程序把main.o和swap.o,用连接器把必要的目标文件组和起来,创建一个可以执行的目标文件
静态链接
静态连接器可以把一组可重复定位的目标文件生成一个可执行文件,但必须完成两个任务
1:符号解析 目标文件的定义和引用符号,符号解析的目的是将每个符号的引用刚好和一个符号的定义联系起来
2:重定位 连接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这符号的引用,使他们指向这个存储器位置,从而重定位这些节;
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/9377.html