ararchiver)是Unix系統上的歸檔工具,用於將多個文件歸檔為一個文件。ar目前一般僅被鏈接器用創建更新靜態庫和生成.deb包。它的歸檔功能現在基本被 tar所取代。[3] GNU Binutils包含ar .[2]

ar
原作者肯·湯普遜 丹尼斯·里奇貝爾實驗室
開發者各類開源和商業軟件開發者。
首次發布1971年11月3日,​53年前​(1971-11-03
操作系統Unix, 類Unix系統, V, Plan 9, Inferno
平台跨平臺
類型命令
archiver
副檔名
.a, .lib, .ar[1]
網路媒體型式
application/x-archive[1]
格式類型歸檔格式
作為容器一般是 目標文件 (.o, .obj)
標準未標準化,有多種形式
免費格式?[2]

Linux標準規範(LSB)中,ar 已被棄用,並可能在將來的版本中移除,理由是LSB不應包含軟件開發工具和指定.o和.a文件格式。[4]

文件格式

 
.deb文件結構示例

ar格式從未標準化過,歷史上有過多種形式[5]V6, V7, AIX和Coherent等,與通用格式都有很大的差別。[6]現在的通用格式主要基於兩種變體:BSDSystem V(最初稱為 COFF,也被 GNUELFWindows使用。)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 用 "/" 文件名表示對應的數據為符號查找表,包含三部分,並存儲為連續的數據。

  1. 一個32位整數大端存儲:符號表的條目數。
  2. 一組32位整數,大端存儲:每個表示該符號在歸檔中的位置。
  3. 一組字符串,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]

參見

參考

  1. ^ 1.0 1.1 application/x-archive. [2019-03-11]. (原始內容存檔於2019-12-08). 
  2. ^ 2.0 2.1 ar(1) - Linux man page. [3 October 2013]. (原始內容存檔於2019-02-12). 
  3. ^ Static Libraries. TLDP. [3 October 2013]. (原始內容存檔於2013-07-03). 
  4. ^ Linux Standard Base Core Specification, version 4.1, Chapter 15. Commands and Utilities > ar頁面存檔備份,存於網際網路檔案館
  5. ^ 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. ^ 6.0 6.1 Manual page for NET/2 ar file format. [2020-09-22]. (原始內容存檔於2017-08-22). 
  7. ^ ar.h. www.unix.com. The UNIX and Linux Forums. 
  8. ^ bminor/binutils-gdb: archive.c. GitHub. [2020-09-22]. (原始內容存檔於2021-03-05) (英語). 
  9. ^ ar – 參考,單一UNIX®規範第7期,由國際開放標準組織發布
  10. ^ Manual page for NET/2 ranlib utility. [2020-09-22]. (原始內容存檔於2021-02-26). 
  11. ^ Manual page for NET/2 ranlib file format. [2020-09-22]. (原始內容存檔於2021-02-25). 
  12. ^ ranlib.h. opensource.apple.com. [2020-09-22]. (原始內容存檔於2021-02-27). 
  13. ^ ar(5) – FreeBSD文件格式(File Formats)手冊頁
  14. ^ ar.h(3HEAD). docs.oracle.com. Oracle Corporation. 11 November 2014 [2018-11-14]. (原始內容存檔於2021-03-03). 
  15. ^ Pietrek, Matt, Under The Hood, Microsoft Systems Journal, April 1998 [2014-08-23], (原始內容存檔於2007-06-24) 
  16. ^ llvm-mirror/llvm: archive.cpp (format detection). GitHub. [10 February 2020]. (原始內容存檔於2021-02-28) (英語). 
  17. ^ ar. GNU Binary Utilities. [2020-09-22]. (原始內容存檔於2021-04-18). 

外部連結