本文有更新,请移步个人我的博客:https://blog.andyqiao.top/article/10/编程
-
加载(load)
- 将程序拷贝到存储器并运行的过程,由加载器(loader)执行。
-
连接分类
- 编译时(compile time)连接:也称为传统静态连接、静态连接;
- 加载时(load time)连接:在程序被加载的时候动态连接共享库;
- 运行时(run time)连接:在程序运行时根据须要动态连接共享库。
-
目标文件
- 可重定位目标文件:可被连接生成可执行目标文件;
- 可执行目标文件:可被直接拷贝至存储器中运行;
- 共享目标文件:能够在加载或者运行时被动态地加载到存储器并连接。
-
库分类
- 静态库:只能在编译时被静态连接 .a;
- 共享库:能够加载时连接或运行时连接 .so .dll 。
-
静态库
- 本质上是一组可重定位目标文件,在连接时,静态连接器只拷备被程序引用的目标模块:
- 优势
- 将一组可重定位目标文件打包至一个静态库,方便使用;
- 在连接时,只拷备被引用模块,减少可执行文件的大小;
- 应用举例:C语言的众多库函数有如下几种打包方式:
- 编译器自动识别并连接:优(1 方便编程),缺(1 C库函数过多,使编译器变得复杂;2 升级时必须更新编译器版本);
- 将全部C库函数放入一个可重定位目标模块:优(1 方便连接,2 方便升级),缺(1 连接时会拷备全部函数,引发代码量过大);
- 将每一个库函数放入多个可重定位目标模块:优(1 最终程序代码量小),缺(1 不方便连接);
- 将全部库函数打包成一个静态库:优(1 方便升级;2 方便连接;3 最终程序代码量小),缺(1 库函数升级时,必须从新编译程序;2 不能在程序之间共享库函数)
-
共享库
- 两种方式
- 加载时连接:当建立可执行文件时,静态执行一部分连接,而后在程序加载时,动态完成连接过程。
- 运行时连接:在程序运行过程当中打开共享库、定位符号地址、完成使用、关闭共享库;
- 应用举例:软件升级(Windows的一些升级就经过更新共享库来完成);
- Linux API:dlopen(打开并加载共享库)、dlsym(获取符号地址)、dlclose(关闭共享库)。
- 与静态库区别
- 在加载时/运行时连接,而不是编译时连接;
- 升级能够经过直接替换共享库文件,而不须要从新编译;
- 运行时连接能够实如今程序之间共享库函数。