静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方。本文简要描述linux下静态库在链接过程中的一些细节。
静态库文件格式
静态库远远不同于动态库,不涉及到符号重定位之类的问题。静态库本质上只是将一堆目标文件进行打包而已。静态库没有标准,不同的linux下都会有些细微的差别。大致的格式wiki上描述的较清楚:
Global header
----------------- +-------------------------------
File header 1 ---> | File name
File content 1 | | File modification timestamp
----------------- | Owner ID
File header 2 | Group ID
File content 2 | File mode
----------------- | File size in bytes
... | File magic
+-------------------------------
File header很多字段都是以ASCII码表示,所以可以用文本编辑器打开。
静态库本质上就是使用ar命令打包一堆.o文件。我们甚至可以用ar随意打包一些文件:
$ echo 'hello' > a.txt && echo 'world' > b.txt
$ ar -r test.a a.txt b.txt
$ cat test.a
!<arch>
a.txt/ 1410628755 60833 100 100644 6 `
hello
b.txt/ 1410628755 60833 100 100644 6 `
world
链接过程
链接器在链接静态库时,同链接一般的.o基本相似。链接过程大致可以归纳下图:

总结为:
- 所有传入链接器的
.o都会被链接进最终的可执行程序;链接.o时,会将.o中的global symbol和unresolved symbol放入一个临时表 - 如果多个
.o定义了相同的global sym

本文详细介绍了Linux下静态库的链接原理,包括静态库文件格式、链接过程、链接顺序问题以及嵌套静态库的处理。重点讨论了链接器如何处理静态库中的符号,以及在实践中的注意事项,如-whole-archive和--start-group选项的使用。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



