Ar (Unix)

ar（archiver）是Unix系统上的归档工具，用于将多个文件归档为一个文件。ar目前一般仅被链接器用创建更新静态库和生成.deb包。它的归档功能现在基本被 tar所取代。 GNU Binutils包含ar . Linux标准规范（LSB）中，ar 已被弃用，并可能在将来的版本中移除，理由是LSB不应包含软件开发工具和指定.o和.a文件格式。 ar格式从未标准化过，历史上有过多种形式 如 V6, V7, AIX和Coherent等，与通用格式都有很大的差别。现在的通用格式主要基于两种变体：BSD 和 System V（最初称为 COFF，也被 GNU， ELF和Windows使用。）Debian的 ".deb" 使用通用格式。 .ar文件起始是一个全局文件头，接着是各个文件的文件头和数据部分。数据部分为2字节对齐，如果数据长度为奇数，则填充一个换行符（\n，0x0A）。 为 "!<arch>" 和换行符（0x0A）. 归档的每个文件包含文件头存储文件信息。下表为通用格式。数值为ASCII编码，并用空格(0x20)向右填充。 标头全部为可打印的ASCII字符和换行符，所以只包含文本文件的ar归档文件仍然是文本文件。 每个文件从偶数字节开始，如果长度为奇数，则需要填充一个换行符，文件头中的文件大小存储是实际大小。 由于文件名长度和格式的限制，GNU和BSD变体都设计了不同的存储长文件名的方法。尽管通用格式不会受到2038年问题的困扰，但很多系统上的ar程序存在这种问题，可能需要修改以正确处理超过2147483647的时间戳。有关这些扩展的说明，请参见libbfd。 根据格式的不同，许多ar实现了用于快速链接的全局符号表（armap，目录或索引）而无需扫描整个存档中的符号。POSIX识别此功能，并且要求ar实现具有 -s选项更新符号表。大多数实现将其放在第一个文件条目中。 BSD ar 在文件名头填充ASCII空格符，文件名如包含空格会有问题。4.4BSD ar将"#1/"和文件名长度放置在文件名字段，并将文件名放置在数据段的最前面 BSD ar 自身不处理全局符号查找表，而使用单独的工具ranlib。ranlib会插入一个与系统架构相关的文件 __.SYMDEF作为第一个文件 一些后来的版本会在名称后面放置一个空格和"SORTED"字符表示已排序。 Darwin 64位系统使用__.SYMDEF_64。 由于POSIX规范要求-s选项，新的BSD ar 重新实现了该要求。FreeBSD 弃用了 SYMDEF 表而采用 System V 类型的查找表。 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/"代替"/" Windows的PE/COFF格式基于 System V/GNU。 第一个条目为 "/" 与System V/GNU符号表相同。第二个条目也是"/"，使用小端整数，表示ECOFF扩展，用于存储经过排序的符号交叉引用表。 第三个条目为 "//" 长文件名数据。 GNU binutils和elfutils中的 ar 有一个 "thin archive" 格式，特征签名为 !<thin>，仅包含符号表和对该文件的引用。 Deb 归档格式 Unix实用程序列表 application/x-archive. [2019-03-11]. （原始内容存档于2019-12-08）.  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 （页面存档备份，存于互联网档案馆） 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] （页面存档备份，存于互联网档案馆） 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） （英语）.  ar – 参考，单一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）.  ar(5) – 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）.  維基教科書中的相關電子教程：Commands ar: create and maintain library archives – 命令与工具（Commands & Utilities）参考，单一UNIX®规范第7期，由國際開放標準組織发布 ar(1) – Plan 9通用命令（General Commands）手册页 ar(1) – Inferno通用命令（General Commands）手册页 ar(1) – Linux用户命令（User Commands）手册页 ar(1) – FreeBSD通用命令（General Commands）手册页 ar(1) – Version 7 Unix Programmer's Manual ar(5) – 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)