ar(归档器)格式是一种文件格式,用于创建和操作归档文件,该文件将多个文件存储在一个文件中。它起源于 Unix 系统,通常用于基于 BSD 的操作系统。ar 格式是一种简单有效的方法,可将多个文件打包在一起以进行存储或分发。
ar 归档文件由一个全局头后跟一系列归档成员组成。每个归档成员代表已存储在归档中的文件。全局头是一个简单的文本头,它将文件标识为 ar 归档,并提供有关归档格式版本的基本信息。
ar 归档的全局头以签名字符串“!
ar 归档中的每个文件成员都包含一个文件头和文件数据本身。文件头包含有关文件元数据,例如其名称、修改时间戳、所有者和组 ID、文件模式和大小。文件头具有 60 字节的固定大小,其结构如下:
- 文件名(16 字节):表示文件名的一个以 null 结尾的字符串。如果文件名长于 15 个字符,则将其截断,并使用特殊符号“/”表示完整文件名存储在单独的文件成员中。
- 文件修改时间戳(12 字节):表示自 1970 年 1 月 1 日(Unix 纪元时间)以来文件修改时间戳的十进制整数(以秒为单位)。
- 所有者 ID(6 字节):表示文件所有者用户 ID 的十进制整数。
- 组 ID(6 字节):表示文件组的组 ID 的十进制整数。
- 文件模式(8 字节):表示文件模式和权限的八进制整数。
- 文件大小(10 字节):表示文件大小(以字节为单位)的十进制整数。
- 结束字符(2 字节):两个特殊字符“`\n`”(反引号后跟换行符),表示文件头的结尾。
在文件头之后,存储文件数据本身。文件数据的大小由头中指定的文件大小决定。如果文件大小为奇数,则添加一个额外的填充字节以确保下一个文件成员的正确对齐。
ar 归档中的一个特殊文件成员是符号表,其名称为“/”。符号表用于存储超过文件头中 15 个字符限制的长文件名。当文件名太长时,它将在文件头中被截断,并且完整名称将存储在符号表中。符号表是一个特殊的文件成员,其中包含一个表示长文件名的以 null 结尾的字符串列表。
另一个特殊的文件成员是长文件名成员,其名称为“/[0-9]+”。此文件成员与符号表结合使用。当文件名太长而无法放入文件头时,将在符号表中创建一个特殊条目,格式为“/[offset]/[length]”,其中“offset”是长文件名成员中存储完整文件名的字节偏移量,“length”是完整文件名的长度。
ar 格式还支持在创建或操作归档文件时可使用的各种选项和标志。一些常见选项包括:
- “r”:将文件插入现有归档中,用具有相同名称的任何现有文件替换它们。
- “c”:创建一个新的归档文件,覆盖具有相同名称的任何现有文件。
- “u”:更新现有归档中的文件,添加新文件或替换文件的旧版本。
- “d”:从现有归档中删除文件。
- “t”:列出归档的内容。
ar 格式的一个限制是它不支持压缩。存储在 ar 归档中的文件未压缩,并以其原始格式存储。但是,ar 归档可以与 gzip 或 bzip2 等压缩实用程序结合使用以创建压缩归档。
尽管 ar 格式很简单,但它已广泛使用了几十年,并且仍然是用于在 Unix 和 BSD 系统上创建和分发库文件的标准格式。许多常见的 Unix 实用程序,例如“ar”命令本身、“ranlib”命令(用于生成符号表)和“nm”命令(用于列出对象文件中的符号),都适用于 ar 归档。
总之,ar(归档器)格式是一种简单有效的文件格式,用于在 Unix 和 BSD 系统上创建和操作归档文件。它由一个标识归档的全局头组成,后跟一系列表示存储在归档中的文件的归档成员。ar 格式通过使用符号表和特殊文件成员支持长文件名。虽然它不提供内置压缩,但 ar 归档可以与压缩实用程序结合使用以创建压缩归档。ar 格式已广泛使用了几十年,并且仍然是用于在 Unix 和 BSD 系统上打包和分发文件的标准格式。