Ar (Unix)
ar(archiver)是Unix系统上的归档工具,用于将多个文件归档为一个文件。 Linux标准规范(LSB)中, 文件格式![]() ar格式从未标准化过,历史上有过多种形式[5] 如 V6, V7, AIX和Coherent等,与通用格式都有很大的差别。[6]现在的通用格式主要基于两种变体:BSD 和 System V(最初称为 COFF,也被 GNU, ELF和Windows使用。)Debian的 ".deb" 使用通用格式。 .ar文件起始是一个全局文件头,接着是各个文件的文件头和数据部分。数据部分为2字节对齐,如果数据长度为奇数,则填充一个换行符(\n,0x0A)。 特征签名为 文件头归档的每个文件包含文件头存储文件信息。下表为通用格式。数值为ASCII编码,并用空格(0x20)向右填充。
标头全部为可打印的ASCII字符和换行符,所以只包含文本文件的ar归档文件仍然是文本文件。 每个文件从偶数字节开始,如果长度为奇数,则需要填充一个换行符,文件头中的文件大小存储是实际大小。[7] 由于文件名长度和格式的限制,GNU和BSD变体都设计了不同的存储长文件名的方法。尽管通用格式不会受到2038年问题的困扰,但很多系统上的ar程序存在这种问题,可能需要修改以正确处理超过2147483647的时间戳。有关这些扩展的说明,请参见libbfd。[8] 根据格式的不同,许多ar实现了用于快速链接的全局符号表(armap,目录或索引)而无需扫描整个存档中的符号。POSIX识别此功能,并且要求ar实现具有 BSD变体BSD ar 在文件名头填充ASCII空格符,文件名如包含空格会有问题。4.4BSD ar将"#1/"和文件名长度放置在文件名字段,并将文件名放置在数据段的最前面[6] BSD ar 自身不处理全局符号查找表,而使用单独的工具ranlib[10]。ranlib会插入一个与系统架构相关的文件 由于POSIX规范要求 System V(或 GNU)变体System V ar 用字符'/'(0x2F)标记文件名结束,从而文件名可以使用空格。需要扩展的文件将文件名存储在"//"文件的数据段,在标头文件名字段中写入'/'和十进制的偏移地址。 "//"文件包含的是长文件名列表,以换行符分割。通常 "//" 是第二个条目,符号表为第一个条目。 System V ar 用 "/" 文件名表示对应的数据为符号查找表,包含三部分,并存储为连续的数据。 有些 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 archiveGNU binutils和elfutils中的 参见参考
外部链接
|