链接与加载过程中,几个关键的概念
2016-09-13 22:17
232 查看
加载(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(关闭共享库)。
与静态库区别
在加载时/运行时链接,而不是编译时链接;
升级可以通过直接替换共享库文件,而不需要重新编译;
运行时链接可以实现在程序之间共享库函数。
相关文章推荐
- 链接与加载过程中,几个关键的概念
- SharePoint Server 2007 Web内容管理中的几个关键概念
- SharePoint Server 2007 Web内容管理中的几个关键概念
- 【华磊原创】-提高用户体验?衡量页面加载速度的几个关键指标。
- c语言编译和链接几个项目的具体过程 在linux下
- 几个编译过程的概念
- 项目管理:规范化的过程及关键概念
- (转)ELF文件的加载和动态链接过程
- 【华磊原创】-提高用户体验?衡量页面加载速度的几个关键指标。
- 浅谈CMMI几个过程概念
- ELF文件的加载和动态链接过程
- php5中关于OOP的几个关键概念(属性)
- 转: SharePoint Server 2007 Web内容管理中的几个关键概念
- 个人对SCA标准中Component,Composite等几个关键概念的理解
- 并发编程:几个关键概念和三个经典问题
- SharePoint Server 2007 Web内容管理中的几个关键概念
- SharePoint Server 2007 Web内容管理中的几个关键概念
- XAML的几个关键概念
- JavaScript中的几个关键概念的理解-原型链的构建
- 【1.9】系统漫游——几个关键概念