深入理解计算机系统之链接(三)
2016-03-11 23:57
323 查看
静态库的概念
静态库就是由一组独立的可重定向目标文件封装而成的,在Unix系统中,静态库以一种称为归档(archive)的特殊文件存放在磁盘上。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个目标文件的大小和位置,存档文件名有后缀.a表示链接器如何使用静态库来解析引用
在符号解析的阶段,链接器从左到右按照他们在编译器驱动程序命令行上出现的相同顺序来扫描可重定位目标文件和存档文件。(驱动程序自动将命令行中所有点.c文件翻译为.o文件)。在这次扫描中,链接器维持一个可重定位目标文件的集合E(这个集合中的文件会被合并起来形成可执行文件),一个未解析的符号(即引用了但是尚未定义的符号)集合U,一个在前面输入文件中已定义的符号集合D。初始时,这三个集合都是空的。使用解析引用的规则如下:
1.对于命令行上的每个输入文件f,链接器会判断f是一个目标文件还是一个归档文件。如果f是一个目标文件,那么链接器把f添加到E,修改U和D来反映f中的符号定义和引用,并继续下一个输入文件。
2.如果f是一个归档文件,那么链接器就尝试匹配U中未解析的符号和由归档文件成员定义的符号,如果某个归档文件成员m,定义了一个符号来解析U中的一个引用,那么就将m加到E中,并且链接器修改U和D来反映m中。对归档文件中所有的成员目标文件都反复进行此过程,直到U和D都不再发生变化。在此时,任何不包含在E中的成员目标文件都简单地被丢弃,而连接器将继续处理下一个输入文件。
3.如果当链接器完成对命令行上输入文件的扫描后,U是非空的,那么链接器就会输出一个错误并终止。否则,它会合并并重定位E中的目标文件,从而构建输出的可执行文件。
但是这样的话可能会引起一些错误,因为命令行上的库和目标文件的调用顺序变得非常重要。在命令行中,如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用不能被解析。
相关文章推荐
- 数据结构学习
- 计算机书籍.网址
- HTTP请求报文和HTTP响应报文
- http://elf8848.iteye.com/blog/875830/
- 如何学好算法和数据结构之我见——51CTO名家访谈实录
- 《大话数据结构》学习记录1--第1,2章和第3章的顺序线性表
- HTTP Session 的理解
- 关于tcp连接的建立(三次握手)和释放(四次握手)
- 微型计算机与单片机
- TCP/IP有限状态机
- 计算机中数的表示
- 无线传感器网络数据融合技术
- 无线传感器网络数据融合概述
- Android高效网络请求Retrofit框架
- 面试2-两种 HTTP 请求方法:GET 和 POST
- iOS 开源项目介绍之网络篇
- 多态的实现:http://bbs.csdn.net/topics/370166353
- tcp短连接TIME_WAIT问题解决方法大全(2)——SO_LINGER
- 面试1-HTTP状态码
- TCP协议中的SO_LINGER选项