深入理解计算机系统之链接(三)

来源:互联网 发布:淘宝的a3狗粮怎么样 编辑:程序博客网 时间:2024/06/07 23:49

静态库的概念

静态库就是由一组独立的可重定向目标文件封装而成的,在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中的目标文件,从而构建输出的可执行文件。

但是这样的话可能会引起一些错误,因为命令行上的库和目标文件的调用顺序变得非常重要。在命令行中,如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用不能被解析。

0 0
原创粉丝点击