函数库、链接、载入
编译过程
-
一个编译过程包含如下步骤:
- 预处理器
- 语法和语义分析器
- 代码生成器:将高级语言翻译成汇编语言(即狭义上的编译过程),并生成汇编文件(
.s
文件) - 优化器
- 汇编程序:将汇编代码翻译成二进制代码(即汇编过程),并生成目标文件(
.o
文件) - 链接-载入器
-
链接-载入器的用途
- 载入目标文件,并确认
main
函数为初始进入点(即程序开始执行的地方) - 把符号引用绑定到内存地址
- 把所有目标问集中在一起,再加上库文件,从而产生可执行文件
- 载入目标文件,并确认
-
不论是静态库还是动态库,只有被调用到的函数才会被载入可执行文件或内存中 —— 由于整个共享库并不是被一次性载入内存的,而是根据需要,以页面为单位载入的,因此动态库(共享库)不会将不需要的函数载入内存。
-
动态库又叫共享库
动态链接和静态链接
- 静态链接(编译时链接):函数库的一份拷贝是可执行文件的物理组成部分,静态链接库通常是
.a
文件 - 动态链接(运行时链接):可执行文件只包含了文件名,让载入器在运行时能够寻找程序所需要的函数库(只有真正调用时才会带来额外的开销),动态链接库通常是
.so
文件 -
动态链接的优缺点
- 优点:
- 节省空间:可执行文件很小,更有效的利用磁盘空间
- 自动更新——假若更新了某个动态库,则所有使用此动态库的程序在下一启动时都会使用新版本的动态库
- 代码共享 —— 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝,因此动态库又叫共享库
- 缺点:
- 运行速度稍慢
- 函数库的路径不能随意移动——链接器通常将库文件名或路径名植入可执行文件中,除非另作说明,否则移动函数库会使程序找不到库函数的定义
- 兼容性问题 —— 若程序版本得到更新,但动态库依旧是老版本,则有可能产生兼容性问题,因为开发者无法在使用者计算机中的动态库进行检查。
- 优点:
-
静态库使用
ar
,而动态库使用ld