概述
.a
是.o
文件的压缩。都是Header+Member。
.a
总体结构如下,第一组比较特殊。第二组开始代表里面的一个个.o
文件
-
标识符
-
Header Line(1)
-
Member(1)
-
Symbol Table
-
String Table
-
-
Header Line(2)
-
Member(2)
标识符
开头8字节标识符!<arch>\n
,\n是换行符(0x0A)
SYMDEF
第一个Member是SYMDEF。
Header Line结构
Header Line占60字节,分成下面七个部分:
-
16字节,name字段:文件名,如果name超过16字节大小或含有空格,真正的name紧随这个header line的后面,name字段的内容是
#1/
+长度数字。__.SYMDEF SORTED代表符号按字母排序。 -
12字节,修改日期字段:stat系统调用返回的st_time。
-
6字节,user ID:stat系统调用返回的st_uid。
-
6字节,group ID:stat系统调用返回的st_gid。
-
8字节,file mode:stat系统调用返回的st_mode,这个字段是8进制的。
-
8字节,file size:stat系统调用返回的st_size,代表紧随header line的Member大小。
-
4字节,
\`
(0x60)和换行符(0x0a)。
Symbol Table
Symbol Table保存.a
里所有.o
的符号表。Symbol Table最前面是table的大小。后面是一个数组,里面的元素数据结构是:
struct ranlib_64 {
union {
/* 符号名,在从符号表开始的偏移 */
uint64_t ran_strx;
} ran_un;
/* .o header line,从文件开始的偏移 */
uint64_t ran_off;
};
String Table
字符串表
.o文件
接下来就是一个个Header Line + .o
的结构了