Ar (Unix)
ar(archiver)是Unix系统上的归档工具,用于将多个文件归档为一个文件。ar
目前一般仅被链接器用创建更新静态库和生成.deb包。它的归档功能现在基本被 tar
所取代。[3] GNU Binutils包含ar
.[2]
原作者 | 肯·汤普逊 丹尼斯·里奇 (贝尔实验室) |
---|---|
开发者 | 各类开源和商业软件开发者。 |
首次发布 | 1971年11月3日 |
操作系统 | Unix, 类Unix系统, V, Plan 9, Inferno |
系统平台 | 跨平台 |
类型 | 命令 |
扩展名 |
|
---|---|
互联网媒体类型 | application/x-archive[1] |
魔术数字 | !<arch> |
格式类型 | 归档格式 |
作为容器 | 一般是 目标文件 (.o , .obj ) |
标准 | 未标准化,有多种形式 |
免费格式? | 是[2] |
Linux标准规范(LSB)中,ar
已被弃用,并可能在将来的版本中移除,理由是LSB不应包含软件开发工具和指定.o和.a文件格式。[4]
文件格式
ar格式从未标准化过,历史上有过多种形式[5] 如 V6, V7, AIX和Coherent等,与通用格式都有很大的差别。[6]现在的通用格式主要基于两种变体:BSD 和 System V(最初称为 COFF,也被 GNU, ELF和Windows使用。)Debian的 ".deb" 使用通用格式。
.ar文件起始是一个全局文件头,接着是各个文件的文件头和数据部分。数据部分为2字节对齐,如果数据长度为奇数,则填充一个换行符(\n,0x0A)。
特征签名
为 "!<arch>"
和换行符(0x0A).
文件头
归档的每个文件包含文件头存储文件信息。下表为通用格式。数值为ASCII编码,并用空格(0x20)向右填充。
偏移 | 长度 | 名称 | 各式 |
---|---|---|---|
0 | 16 | 文件标识符 | ASCII |
16 | 12 | 文件修改时间 | 十进制 |
28 | 6 | 所有者ID | 十进制 |
34 | 6 | 组ID | 十进制 |
40 | 8 | 文件模式 | 八进制 |
48 | 10 | 文件大小字节数 | 十进制 |
58 | 2 | 结束字符 | 0x60 0x0A |
标头全部为可打印的ASCII字符和换行符,所以只包含文本文件的ar归档文件仍然是文本文件。
每个文件从偶数字节开始,如果长度为奇数,则需要填充一个换行符,文件头中的文件大小存储是实际大小。[7]
由于文件名长度和格式的限制,GNU和BSD变体都设计了不同的存储长文件名的方法。尽管通用格式不会受到2038年问题的困扰,但很多系统上的ar程序存在这种问题,可能需要修改以正确处理超过2147483647的时间戳。有关这些扩展的说明,请参见libbfd。[8]
根据格式的不同,许多ar实现了用于快速链接的全局符号表(armap,目录或索引)而无需扫描整个存档中的符号。POSIX识别此功能,并且要求ar实现具有 -s
选项更新符号表。大多数实现将其放在第一个文件条目中。[9]
BSD变体
BSD ar 在文件名头填充ASCII空格符,文件名如包含空格会有问题。4.4BSD ar将"#1/"和文件名长度放置在文件名字段,并将文件名放置在数据段的最前面[6]
BSD ar 自身不处理全局符号查找表,而使用单独的工具ranlib[10]。ranlib会插入一个与系统架构相关的文件 __.SYMDEF
作为第一个文件[11] 一些后来的版本会在名称后面放置一个空格和"SORTED"字符表示已排序。[12] Darwin 64位系统使用__.SYMDEF_64
。
由于POSIX规范要求-s
选项,新的BSD ar 重新实现了该要求。FreeBSD 弃用了 SYMDEF 表而采用 System V 类型的查找表。[13]
System V(或 GNU)变体
System V ar 用字符'/'(0x2F)标记文件名结束,从而文件名可以使用空格。需要扩展的文件将文件名存储在"//"文件的数据段,在标头文件名字段中写入'/'和十进制的偏移地址。 "//"文件包含的是长文件名列表,以换行符分割。通常 "//" 是第二个条目,符号表为第一个条目。
System V ar 用 "/" 文件名表示对应的数据为符号查找表,包含三部分,并存储为连续的数据。
- 一个32位整数,大端存储:符号表的条目数。
- 一组32位整数,大端存储:每个表示该符号在归档中的位置。
- 一组字符串,0结尾:符号名称
有些 System V ar不使用上述各式,如HP-UX 11.0,上述信息存储为 SOM文件格式。
为解决4GiB文件限制,某些系统如Solaris 11.2 和 GNU使用不同的查找表。不同之处在于使用64位整数和用"/SYM64/"代替"/"[14]
Windows 变体
Windows的PE/COFF格式基于 System V/GNU。 第一个条目为 "/" 与System V/GNU符号表相同。第二个条目也是"/",使用小端整数,表示ECOFF扩展,用于存储经过排序的符号交叉引用表。 [5][15] 第三个条目为 "//" 长文件名数据。[16]
Thin archive
GNU binutils和elfutils中的 ar
有一个 "thin archive" 格式,特征签名为 !<thin>
,仅包含符号表和对该文件的引用。[17]
参见
- Deb
- 归档格式
- Unix实用程序列表
参考
- ^ 1.0 1.1 application/x-archive. [2019-03-11]. (原始内容存档于2019-12-08).
- ^ 2.0 2.1 ar(1) - Linux man page. [3 October 2013]. (原始内容存档于2019-02-12).
- ^ Static Libraries. TLDP. [3 October 2013]. (原始内容存档于2013-07-03).
- ^ Linux Standard Base Core Specification, version 4.1, Chapter 15. Commands and Utilities > ar (页面存档备份,存于互联网档案馆)
- ^ 5.0 5.1 Levine, John R. Chapter 6: Libraries. Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming 1. San Francisco, USA: Morgan Kaufmann. 2000 [October 1999] [2020-01-12]. ISBN 1-55860-496-0. OCLC 42413382. ISBN 978-1-55860-496-4. (原始内容存档于2012-12-05). Code: [1][2] Errata: [3] (页面存档备份,存于互联网档案馆)
- ^ 6.0 6.1 Manual page for NET/2 ar file format. [2020-09-22]. (原始内容存档于2017-08-22).
- ^ ar.h. www.unix.com. The UNIX and Linux Forums.
- ^ bminor/binutils-gdb: archive.c. GitHub. [2020-09-22]. (原始内容存档于2021-03-05) (英语).
- ^ – 参考,单一UNIX®规范第7期,由国际开放标准组织发布
- ^ Manual page for NET/2 ranlib utility. [2020-09-22]. (原始内容存档于2021-02-26).
- ^ Manual page for NET/2 ranlib file format. [2020-09-22]. (原始内容存档于2021-02-25).
- ^ ranlib.h. opensource.apple.com. [2020-09-22]. (原始内容存档于2021-02-27).
- ^ – FreeBSD文件格式(File Formats)手册页
- ^ ar.h(3HEAD). docs.oracle.com. Oracle Corporation. 11 November 2014 [2018-11-14]. (原始内容存档于2021-03-03).
- ^ Pietrek, Matt, Under The Hood, Microsoft Systems Journal, April 1998 [2014-08-23], (原始内容存档于2007-06-24)
- ^ llvm-mirror/llvm: archive.cpp (format detection). GitHub. [10 February 2020]. (原始内容存档于2021-02-28) (英语).
- ^ ar. GNU Binary Utilities. [2020-09-22]. (原始内容存档于2021-04-18).
外部链接
- : create and maintain library archives – 命令与工具(Commands & Utilities)参考,单一UNIX®规范第7期,由国际开放标准组织发布
- – Plan 9通用命令(General Commands)手册页
- – Inferno通用命令(General Commands)手册页
- – Linux用户命令(User Commands)手册页
- – FreeBSD通用命令(General Commands)手册页
- – Version 7 Unix Programmer's Manual
- – FreeBSD文件格式(File Formats)手册页 -- an account of Unix formats
- The 32-bit PA-RISC Run-time Architecture Document, HP-UX 11.0 Version 1.0, Hewlett-Packard, 1997.
See Chapter 4: Relocatable Libraries. Available at [4] (devresource.hp.com)