Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Утилита архивации Unix
Unix archiver utility
В Linux Standard Base (LSB) утилита ar признана устаревшей и, как ожидается, будет удалена в одной из будущих версий стандарта. Причина заключалась в том, что "LSB не включает в себя инструменты разработки программного обеспечения и не определяет форматы файлов o и a".
In the Linux Standard Base (LSB), ar has been deprecated and is expected to disappear in a future release of that standard. The rationale provided was that "the LSB does not include software development utilities nor does it specify o and a file formats."
Формат файла
Формат ar никогда не был стандартизирован; современные архивы основаны на общем формате с двумя основными вариантами, BSD и System V (первоначально известный как COFF и также используемый GNU, ELF и Windows). Исторически существовали и другие варианты, включая V6, V7, AIX (малый и большой) и Coherent, которые все значительно отличаются от общего формата. Архивы Debian ".deb" используют общий формат. Файл ar начинается с глобального заголовка, за которым следуют заголовок и секция данных для каждого файла, хранящегося в архиве ar. Каждая секция данных выровнена по 2 байтам. Если она заканчивается на нечётном смещении, символ новой строки ('\n', 0x0A) используется для заполнения.
The ar format has never been standardized; modern archives are based on a common format with two main variants, BSD and System V (initially known as COFF, and used as well by GNU, ELF, and Windows.) Historically there have been other variants including V6, V7, AIX (small and big), and Coherent, which all vary significantly from the common format. Debian ". deb" archives use the common format. An ar file begins with a global header, followed by a header and data section for each file stored within the ar file. Each data section is 2 byte aligned. If it would end on an odd offset, a newline ('\n', 0x0A) is used as filler.
Подпись файла
Подпись файла представляет собой одно поле, содержащее магическую ASCII-строку "!<arch>", за которой следует один управляющий символ LF (0x0A).
The file signature is a single field containing the magic ASCII string "!<arch>" followed by a single LF control character (0x0A).
Вариант BSD
BSD ar хранит имена файлов, дополненные пробелами ASCII. Это вызывает проблемы с пробелами внутри имен файлов. В 4.4BSD ar расширенные имена файлов хранятся путем добавления строки "#1/" и длины имени файла в поле имени файла, а само имя файла сохраняется перед разделом данных. Также добавляется файл, специфичный для архитектуры, с именем SYMDEF в качестве первого элемента архива. Некоторые производные версии добавляют пробел и "SORTED" после имени, чтобы указать на отсортированную версию. На Darwin существует 64-битная разновидность. Поскольку POSIX добавил требование к опции `--symbols` в качестве замены ranlib, более новые реализации BSD ar были переписаны для поддержки этой функции. FreeBSD, в частности, отказался от формата таблицы SYMDEF и перешел на таблицу в стиле System V.
BSD ar stores filenames right padded with ASCII spaces. This causes issues with spaces inside filenames. 4.4BSD ar stores extended filenames by placing the string "#1/" followed by the file name length in the file name field, and storing the real filename in front of the data section. which inserts an architecture specific file named SYMDEF as first archive member. Some descendents put a space and "SORTED" after the name to indicate a sorted version. A 64 bit variant called exists on Darwin. Since POSIX added the requirement for the option as an replacement of ranlib, however, newer BSD ar implementations have been rewritten to have this feature. FreeBSD in particular ditched the SYMDEF table format and embraced the System V style table.
Вариант системы V (или GNU)
Система V ar использует символ "/" (0x2F) для обозначения конца имени файла; это позволяет использовать пробелы без использования длинных имен файлов. Затем она хранит несколько длинных имен файлов в разделе данных файла с именем "//", на эту запись ссылаются последующие заголовки. Заголовок ссылается на длинное имя файла, сохраняя "/" за которым следует десятичное смещение до начала имени файла в разделе данных длинных имен файлов. Формат самого файла "//" представляет собой просто список длинных имен файлов, каждый из которых разделен одним или несколькими символами LF. Обратите внимание, что десятичные смещения указывают количество символов, а не номер строки или строки в файле "//". Обычно это вторая запись в файле, после таблицы символов, которая всегда является первой. Система V ar использует специальное имя файла "/", чтобы указать, что следующая запись данных содержит таблицу поиска символов, которая используется в библиотеках ar для ускорения доступа. Эта таблица символов состоит из трех частей, которые записываются вместе как смежные данные. 32-битное целое число в формате big endian, указывающее количество записей в таблице. Набор 32-битных целых чисел в формате big endian. По одному для каждого символа, записывающему позицию в архиве заголовка файла, содержащего этот символ. Набор строк, завершающихся нулевым символом. Каждая из них – это имя символа, и они встречаются в том же порядке, что и список позиций в части 2. Некоторые системы System V не используют формат, описанный выше, для таблицы поиска символов. Для операционных систем, таких как HP UX 11.0, эта информация хранится в структуре данных, основанной на формате файла SOM. Специальный файл "/" не завершается определенной последовательностью; конец определяется после прочтения последнего имени символа. Для преодоления ограничения на размер файла в 4 Гбайт некоторые операционные системы, такие как Solaris 11.2 и GNU, используют альтернативную таблицу поиска. Вместо 32-битных целых чисел в таблицах поиска символов используются 64-битные целые числа. Строка "/SYM64/" вместо "/" используется в качестве идентификатора для этой таблицы.
System V ar uses a '/' character (0x2F) to mark the end of the filename; this allows for the use of spaces without the use of an extended filename. Then it stores multiple extended filenames in the data section of a file with the name "//", this record is referred to by future headers. A header references an extended filename by storing a "/" followed by a decimal offset to the start of the filename in the extended filename data section. The format of this "//" file itself is simply a list of the long filenames, each separated by one or more LF characters. Note that the decimal offsets are number of characters, not line or string number within the "//" file. This is usually the second entry of the file, after the symbol table which always is the first. System V ar uses the special filename "/" to denote that the following data entry contains a symbol lookup table, which is used in ar libraries to speed up access. This symbol table is built in three parts which are recorded together as contiguous data. A 32 bit big endian integer, giving the number of entries in the table. A set of 32 bit big endian integers. One for each symbol, recording the position within the archive of the header for the file containing this symbol. A set of Zero terminated strings. Each is a symbol name, and occurs in the same order as the list of positions in part 2. Some System V systems do not use the format described above for the symbol lookup table. For operating systems such as HP UX 11.0, this information is stored in a data structure based on the SOM file format. The special file "/" is not terminated with a specific sequence; the end is assumed once the last symbol name has been read. To overcome the 4 GiB file size limit some operating system like Solaris 11.2 and GNU use a variant lookup table. Instead of 32 bit integers, 64 bit integers are used in the symbol lookup tables. The string "/SYM64/" instead "/" is used as identifier for this table
Вариант Windows
Вариант Windows (PE/COFF) основан на варианте SysV/GNU. Первая запись "/" имеет ту же структуру, что и таблица символов SysV/GNU. Вторая запись – это еще один "/", расширение Microsoft, которое хранит расширенную таблицу перекрестных ссылок символов. Она отсортирована и использует целые числа в формате little-endian. Третья запись – это необязательные данные длинного имени "//", как и в SysV/GNU.
The Windows (PE/COFF) variant is based on the SysV/GNU variant. The first entry "/" has the same layout as the SysV/GNU symbol table. The second entry is another "/", a Microsoft extension that stores an extended symbol cross reference table. This one is sorted and uses little endian integers. The third entry is the optional "//" long name data as in SysV/GNU.
Небольшой архив
Версия в GNU binutils и Elfutils имеет дополнительный формат "тонкого архива" с магическим номером. Тонкий архив содержит только таблицу символов и ссылки на исходный файл. Формат файла по сути является архивом формата System V, в котором каждый файл хранится без секций данных. Каждое имя файла хранится как "длинное" имя и должно разрешаться так, как если бы это были символические ссылки.
The version of in GNU binutils and Elfutils have an additional "thin archive" format with the magic number A thin archive only contains a symbol table and references to the file. The file format is essentially a System V format archive where every file is stored without the data sections. Every filename is stored as a "long" filename and they are to be resolved as if they were symbolic links.