Архиватор , также известный просто как ar , — это утилита Unix , которая поддерживает группы файлов как один архивный файл . Сегодня, как правило, используется только для создания и обновления статических библиотечных файлов, которые использует редактор ссылок или компоновщик , а также для генерации пакетов .deb для семейства Debian ; его можно использовать для создания архивов для любых целей, но в значительной степени он был заменен для целей, отличных от статических библиотек. [3] Реализация включена в качестве одного из GNU Binutils . [2]ar
tar
ar
В Linux Standard Base (LSB) ar
был объявлен устаревшим и, как ожидается, исчезнет в будущем выпуске этого стандарта. Обоснованием было то, что «LSB не включает утилиты разработки программного обеспечения и не определяет форматы файлов .o и .a». [4]
Формат ar никогда не был стандартизирован; современные архивы основаны на общем формате с двумя основными вариантами: BSD и System V (первоначально известный как COFF , а также используемый GNU , ELF и Windows ).
Исторически существовали и другие варианты [5], включая V6 , V7 , AIX (маленький и большой) и Coherent, которые все значительно отличаются от общепринятого формата. [6]
Архивы Debian ". deb " используют общий формат.
Файл ar начинается с глобального заголовка , за которым следует заголовок и раздел данных для каждого файла, хранящегося в файле ar.
Каждая секция данных выровнена по 2 байта. Если она заканчивается на нечетном смещении, в качестве заполнителя используется новая строка ('\n', 0x0A).
Сигнатура файла представляет собой одно поле, содержащее магическую строку ASCII, "!<arch>"
за которой следует один управляющий символ LF (0x0A).
Каждый файл, хранящийся в архиве ar, включает заголовок файла для хранения информации о файле. Общий формат следующий. Числовые значения кодируются в ASCII, и все значения дополняются справа пробелами ASCII (0x20).
Поскольку заголовки включают только печатные символы ASCII и символы перевода строки, архив, содержащий только текстовые файлы, по-прежнему сам по себе выглядит как текстовый файл.
Члены выравниваются по четным границам байтов. «Каждый член файла архива начинается с четной границы байтов; при необходимости между файлами вставляется новая строка. Тем не менее, указанный размер отражает фактический размер файла без учета заполнения». [7]
Из-за ограничений длины и формата имени файла, варианты GNU и BSD разработали различные методы хранения длинных имен файлов. Хотя общий формат не страдает от проблемы 2038 года , многие реализации утилиты ar страдают и могут нуждаться в модификации в будущем для корректной обработки временных меток свыше 2147483647. Описание этих расширений можно найти в libbfd. [8]
В зависимости от формата, многие реализации ar включают глобальную таблицу символов (также известную как armap, directory или index) для быстрого связывания без необходимости сканирования всего архива на предмет символа. POSIX распознает эту функцию и требует, чтобы реализации ar имели возможность -s
ее обновления. Большинство реализаций помещают ее в первую запись файла. [9]
BSD ar сохраняет имена файлов, дополненные справа пробелами ASCII. Это вызывает проблемы с пробелами внутри имен файлов. 4.4BSD ar сохраняет расширенные имена файлов, помещая строку "#1/" с последующей длиной имени файла в поле имени файла и сохраняя настоящее имя файла перед разделом данных. [6]
Утилита BSD ar традиционно не занимается построением глобальной таблицы поиска символов и делегирует эту задачу отдельной утилите ranlib , [10] которая вставляет файл, специфичный для архитектуры, названный __.SYMDEF
первым членом архива. [11] Некоторые потомки ставят пробел и «SORTED» после имени, чтобы указать на отсортированную версию. [12] 64-битный вариант с именем __.SYMDEF_64
существует в Darwin .
Однако с тех пор, как POSIX добавил требование для -s
опции в качестве замены ranlib, более новые реализации BSD ar были переписаны для поддержки этой функции. FreeBSD, в частности, отказалась от формата таблицы SYMDEF и приняла таблицу в стиле System V. [13]
System V ar использует символ '/' (0x2F) для обозначения конца имени файла; это позволяет использовать пробелы без использования расширенного имени файла. Затем он сохраняет несколько расширенных имен файлов в разделе данных файла с именем "//", на эту запись ссылаются будущие заголовки. Заголовок ссылается на расширенное имя файла, сохраняя "/", за которым следует десятичное смещение к началу имени файла в разделе данных расширенного имени файла. Формат этого файла "//" сам по себе представляет собой просто список длинных имен файлов, каждое из которых разделено одним или несколькими символами LF. Обратите внимание, что десятичные смещения представляют собой количество символов, а не номер строки или строки в файле "//". Обычно это вторая запись файла после таблицы символов, которая всегда является первой.
System V ar использует специальное имя файла "/" для обозначения того, что следующая запись данных содержит таблицу поиска символов, которая используется в библиотеках ar для ускорения доступа. Эта таблица символов состоит из трех частей, которые записываются вместе как непрерывные данные.
Некоторые системы System V не используют описанный выше формат для таблицы поиска символов. Для операционных систем, таких как HP-UX 11.0, эта информация хранится в структуре данных на основе формата файла SOM .
Специальный файл «/» не завершается определенной последовательностью; конец предполагается после прочтения последнего имени символа.
Чтобы преодолеть ограничение на размер файла в 4 GiB, некоторые операционные системы, такие как Solaris 11.2 и GNU, используют таблицу поиска вариантов. Вместо 32-битных целых чисел в таблицах поиска символов используются 64-битные целые числа. В качестве идентификатора для этой таблицы вместо "/" используется строка "/SYM64/" [14]
Вариант Windows (PE/COFF) основан на варианте SysV/GNU. Первая запись "/" имеет ту же структуру, что и таблица символов SysV/GNU. Вторая запись — это еще одна "/", расширение Microsoft, которое хранит расширенную таблицу перекрестных ссылок символов. Эта отсортирована и использует целые числа с прямым порядком байтов. [5] [15] Третья запись — это необязательные данные длинного имени "//", как в SysV/GNU. [16]
Версия ar
в GNU binutils и Elfutils имеет дополнительный формат «тонкого архива» с магическим числом !<thin> . Тонкий архив содержит только таблицу символов и ссылки на файл. Формат файла по сути является архивом формата System V, где каждый файл хранится без разделов данных. Каждое имя файла хранится как «длинное» имя файла, и они должны быть разрешены так, как если бы они были символическими ссылками . [17]
Чтобы создать архив из файлов class1.o , class2.o , class3.o , следует использовать следующую команду:
ar rcs libclass.a class1.o class2.o class3.o
Компоновщики Unix, обычно вызываемые через компилятор Ccc
, могут читать ar
файлы и извлекать из них объектные файлыlibclass.a
, поэтому, если это архив, содержащий class1.o
, class2.o
и class3.o
, то
cc main.c libclass.a
или (если libclass.a находится в стандартном пути к библиотеке, например /usr/local/lib )
cc main.c -lclass
или (во время связывания)
ld ... main.o -lclass ...
то же самое, что и:
cc main.c класс1.o класс2.o класс3.o