第5章 对链接的思考
●函数库、链接和载入
编译器创建一个输出文件,这个文件包含了可重定位的对象,这些对象就是与源程序对应的数据和机器指令。绝大多数编译器并不是一个单一的庞大程序,而通常是有若干稍小的程序组成。之所以这样,是因为在程序中如果每个具有特定功能的部分自身都是一个完整的程序,更容易设计和维护。
目标文件并不能直接直接执行,它首先需要载入到链接器中,链接器确认main函数为程序开始执行的地方,把符号引用绑定到内存地址,把所有的目标文件集中在一起,再加上库文件,从而产生可执行文件。
如果函数库的一份拷贝是可执行文件的物理组成部分称之为静态链接;如果可执行文件只是包含文件名,让载入器在运行时能够寻找程序所需要的函数库称之为动态链接。
●动态链接的优点
动态链接的优点是可执行文件的体积可以很小,虽然运行速度稍慢一些,但动态链接能够更加有效地利用存储空间。
动态链接可以从两个方面提高性能:
1、动态链接可执行文件比功能相同的静态链接可执行文件的体积小。
2、所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。
动态链接是以一种just-in-time链接,这意味着程序在运行时必须能够找到它们所需要的函数库。链接器通过把库文件名或路径名植入可执行文件中来做到这一点,这也意味着函数库的路径不能随意移动。 任何人都可以创建静态或动态的函数库,只需简单地编译一些不包含main函数的代码,并把编译生成的文件用正确的实用工具进行处理。
根据经验,对于函数库应该始终使用与位置无关代码。
●警惕Interpositioning
Interpositioning就是通过编写与库函数同名的函数来取代库函数的行为。
如果标识符是被保留的,就表示用户不能重定义它。然而这并不是一个约束条件,当这种情况发生时,它并不要求编译器给出错误信息。它只是造成一些不可移植问题或出现未定义的行为。避免麻烦最容易的方法就是认为这些标识符始终属于系统所有,不把它们用作自己的标识符。
文章评论(0条评论)
登录后参与讨论