静态库的链接基本上同链接目标文件.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 symbol
,那么就会