深入理解计算机操作系统——第7章:静态链接
链接
(1)链接是将各个代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可以被加载在存储器上执行。
链接执行时期:
(2)链接可在编译时执行:源代码被翻译成机器代码时
(3)链接可在加载时执行:也就是程序被加载器加载到存储器并执行时。
(4)甚至可以在运行时:由应用程序来执行。
链接好处:
(5)链接使得分离编译成为了可能,可以将一个大型的应用程序分成一个个小的模块,从而可以单独的修改,编译,
这些模块,当需要修改某个模块时,只需要重新编译这个模块,再链接就可以了。而不需要编译整个应用程序。
7.1 编译器驱动程序
例如:有文件mian·c 和文件swap·c 运行>>gcc -02 -g -o p main.c swap.c发生如下过程
预处理器:cpp 编译器cc1 汇编器as 连接器ld
(1)将mian·c通过预处理器到mian·i (ascii码中间文件),通过编译器到mian·s(ascii码汇编语言文件),
通过汇编器到mian·o(可重定位目标文件)
(2)与上面一样将swap·c做同样的处理。
(3)通过链接器,将mian·o和swap·o和一些必要的系统文件组合起来,创建一个可执行目标文件p
>>./p 这样就可以将文件p加载执行了。
7.2 静态链接:
(1)以可重定位目标文件和命令行参数作为输入,生成一个完全链接的可加载和运行的可执行目标文件。
链接器主要的两个任务:
(2)符号解析:将每一个符号引用刚好和符号定义联系起来。
(3)重定位:编译器和汇编器生成的是从0开始编址的代码和数据节,链接器通过把每一个符号定义与一个存储器位置
联系起来,然后修改这些符号的引用,从而来重定位这些节。
7.3 目标文件
目标文件纯粹是字节块的集合
(1)可重定位目标文件
(2)可执行目标文件
(3)可共享目标文件。