Введение

Утилита архивации Unix

В Linux Standard Base (LSB) утилита ar признана устаревшей и, как ожидается, будет удалена в одной из будущих версий стандарта. Причина заключалась в том, что "LSB не включает в себя инструменты разработки программного обеспечения и не определяет форматы файлов o и a".

Формат файла

Формат ar никогда не был стандартизирован; современные архивы основаны на общем формате с двумя основными вариантами, BSD и System V (первоначально известный как COFF и также используемый GNU, ELF и Windows). Исторически существовали и другие варианты, включая V6, V7, AIX (малый и большой) и Coherent, которые все значительно отличаются от общего формата. Архивы Debian ".deb" используют общий формат. Файл ar начинается с глобального заголовка, за которым следуют заголовок и секция данных для каждого файла, хранящегося в архиве ar. Каждая секция данных выровнена по 2 байтам. Если она заканчивается на нечётном смещении, символ новой строки ('\n', 0x0A) используется для заполнения.

Подпись файла

Подпись файла представляет собой одно поле, содержащее магическую ASCII-строку "!<arch>", за которой следует один управляющий символ LF (0x0A).

Вариант BSD

BSD ar хранит имена файлов, дополненные пробелами ASCII. Это вызывает проблемы с пробелами внутри имен файлов. В 4.4BSD ar расширенные имена файлов хранятся путем добавления строки "#1/" и длины имени файла в поле имени файла, а само имя файла сохраняется перед разделом данных. Также добавляется файл, специфичный для архитектуры, с именем SYMDEF в качестве первого элемента архива. Некоторые производные версии добавляют пробел и "SORTED" после имени, чтобы указать на отсортированную версию. На Darwin существует 64-битная разновидность. Поскольку POSIX добавил требование к опции `--symbols` в качестве замены ranlib, более новые реализации BSD ar были переписаны для поддержки этой функции. FreeBSD, в частности, отказался от формата таблицы SYMDEF и перешел на таблицу в стиле System V.

Вариант системы 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/" вместо "/" используется в качестве идентификатора для этой таблицы.

Вариант Windows

Вариант Windows (PE/COFF) основан на варианте SysV/GNU. Первая запись "/" имеет ту же структуру, что и таблица символов SysV/GNU. Вторая запись – это еще один "/", расширение Microsoft, которое хранит расширенную таблицу перекрестных ссылок символов. Она отсортирована и использует целые числа в формате little-endian. Третья запись – это необязательные данные длинного имени "//", как и в SysV/GNU.

Небольшой архив

Версия в GNU binutils и Elfutils имеет дополнительный формат "тонкого архива" с магическим номером. Тонкий архив содержит только таблицу символов и ссылки на исходный файл. Формат файла по сути является архивом формата System V, в котором каждый файл хранится без секций данных. Каждое имя файла хранится как "длинное" имя и должно разрешаться так, как если бы это были символические ссылки.