第五章 对链接的思考

1,动态链接:可执行文件只包含了文件名,让载入器运行时寻找程序所需要的函数库.
程序在运行时寻找它们,而不是把这些函数的二进制码作为自身可执行文件的一部分.
静态链接:函数库的一份拷贝是可执行文件的物理组成部分.

2,动态链接提高性能:
(1)尽管单个可执行文件的启动速度稍受影响,但是动态链接可执行文件比功能相同的静态文件小,可以节省磁盘空间和虚拟内存.
(2)所有动态链接到同一个函数库的可执行文件在运行时共享这个函数库的同一份拷贝.
如果是静态链接,每个文件都拥有函数库的一份物理拷贝,显然极为浪费.
(3)动态链接库的版本升级更容易.
注:动态链接是一种"just-in-time"链接,意味着程序运行时必须能够找到它们所需要的函数库.

3,动态库文件的扩展名".so",静态库文件的扩展名".a".
4,观察头文件,确认所使用的函数库.
每个头文件可能代表一个必须链接的库.
一个函数库包括多个函数,这些函数的声明可能散布于多个头文件中.

5,静态链接和动态链接在链接语义上存在重大区别:
(1)动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的.
(2)对于静态链接库,只是载入载入器当时所知道的未定义符号.
因此:命令行中各个静态链接库出现的顺序是非常重要的.
建议:始终将-l 函数库 放在编译命令行的最右边.

6,警惕:Interpositioning
通过编写与库函数同名的函数来取代该函数库的行为.
注:这样做后,不仅你自己对库函数的调用将被自己版本的函数调用所取代,而且所有调用该库函数的系统调用也将调用你自己的那个函数版本.

你可能感兴趣的:(思考)