ar (Unix) - ar (Unix)

ар
Автор (ы) оригинала Кен Томпсон ,
Деннис Ричи
( AT&T Bell Laboratories )
Разработчики) Различные разработчики с открытым исходным кодом и коммерческие разработчики
Первый выпуск 3 ноября 1971 г . ; 49 лет назад ( 1971-11-03 )
Операционная система Unix , Unix-подобный , V , Plan 9 , Inferno
Платформа Кроссплатформенность
Тип Командование
формат архиватора
Расширение имени файла
.a , .lib , .ar
Тип интернет-СМИ
приложение / x-архив
Магическое число ! <арх>
Тип формата формат архива
Контейнер для обычно объектные файлы ( .o , .obj )
Стандарт Не стандартизирован, существует несколько вариантов
Открытый формат ? да

Архиватор , также известный просто как ар , является Unix утилиты , которая поддерживает группу файлов в один архивный файл . Сегодня arон обычно используется только для создания и обновления файлов статических библиотек, которые использует редактор ссылок или компоновщик, а также для создания пакетов .deb для семейства Debian ; его можно использовать для создания архивов для любых целей, но он в значительной степени заменен tarдля целей, отличных от статических библиотек. Реализация arвключена как один из GNU Binutils .

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

Детали формата файла

Диаграмма, показывающая пример файловой структуры файла .deb

Формат ar никогда не стандартизировался; современные архивы основаны на общем формате с двумя основными вариантами: BSD и System V (первоначально известный как COFF и также используемый GNU , ELF и Windows ).

Исторически существовали и другие варианты, включая V6 , V7 , AIX (маленький и большой) и Coherent, которые все значительно отличаются от общего формата.

Архивы Debian ". Deb " используют общий формат.

Файл ar начинается с глобального заголовка , за которым следует заголовок и раздел данных для каждого файла, хранящегося в файле ar.

Каждый раздел данных выровнен по 2 байта. Если он заканчивается нечетным смещением, в качестве заполнителя используется новая строка ('\ n', 0x0A).

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

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

Заголовок файла

Каждый файл, хранящийся в архиве ar, включает заголовок файла для хранения информации о файле. Общий формат следующий. Числовые значения кодируются в ASCII, и все значения дополняются справа пробелами ASCII (0x20).

Компенсировать Длина Имя Формат
0 16 Идентификатор файла ASCII
16 12 Отметка времени изменения файла (в секундах) Десятичный
28 год 6 ID владельца Десятичный
34 6 ID группы Десятичный
40 8 Файловый режим (тип и разрешение) Восьмеричный
48 10 Размер файла в байтах Десятичный
58 2 Конечные персонажи 0x60 0x0A

Поскольку заголовки включают только печатаемые символы ASCII и переводы строк, архив, содержащий только текстовые файлы, по-прежнему выглядит как текстовый файл.

Члены выровнены по четным границам байтов. «Каждый элемент архивного файла начинается на четной границе байта; при необходимости между файлами вставляется новая строка. Тем не менее, указанный размер отражает фактический размер файла без дополнения».

Из-за ограничений длины и формата имени файла, варианты GNU и BSD разработали разные методы хранения длинных имен файлов. Хотя общий формат не страдает от проблемы 2038 года , многие реализации утилиты ar нуждаются и, возможно, в будущем потребуется изменить для правильной обработки временных меток, превышающих 2147483647. Описание этих расширений можно найти в libbfd.

В зависимости от формата многие реализации ar включают глобальную таблицу символов (также известную как armap, каталог или индекс) для быстрого связывания без необходимости сканировать весь архив на предмет наличия символа. POSIX распознает эту функцию и требует, чтобы реализации ar имели -sвозможность ее обновления. Большинство реализаций помещают его в первую запись файла.

Вариант BSD

BSD ar хранит имена файлов, заполненные справа пробелами ASCII. Это вызывает проблемы с пробелами внутри имен файлов. 4.4BSD ar сохраняет расширенные имена файлов, помещая строку «# 1 /», за которой следует длина имени файла, в поле имени файла и сохраняет реальное имя файла перед разделом данных.

Утилита BSD ar традиционно не обрабатывает построение глобальной таблицы поиска символов и делегирует эту задачу отдельной утилите с именем ranlib , которая вставляет зависящий от архитектуры файл с именем __.SYMDEFпервого члена архива. Некоторые потомки ставят после имени пробел и «СОРТИРОВАТЬ», чтобы указать отсортированную версию. 64-битный вариант, называемый Дарвином,__.SYMDEF_64 существует .

Однако, поскольку POSIX добавил требование для этой -sопции в качестве замены ranlib, более новые реализации BSD ar были переписаны, чтобы иметь эту функцию. FreeBSD, в частности, отказалась от формата таблицы SYMDEF и приняла таблицу стиля System V.

Вариант System V (или GNU)

System V ar использует символ '/' (0x2F) для обозначения конца имени файла; это позволяет использовать пробелы без использования расширенного имени файла. Затем он сохраняет несколько расширенных имен файлов в разделе данных файла с именем «//», на эту запись будут ссылаться будущие заголовки. Заголовок ссылается на расширенное имя файла, сохраняя "/" с последующим десятичным смещением до начала имени файла в разделе данных расширенного имени файла. Формат этого файла «//» представляет собой просто список длинных имен файлов, каждое из которых разделено одним или несколькими символами LF. Обратите внимание, что десятичные смещения - это количество символов, а не номер строки или строки в файле «//». Обычно это вторая запись файла после таблицы символов, которая всегда является первой.

System V ar использует специальное имя файла «/», чтобы обозначить, что следующая запись данных содержит таблицу поиска символов, которая используется в библиотеках ar для ускорения доступа. Эта таблица символов состоит из трех частей, которые записываются вместе как непрерывные данные.

  1. 32-битное целое число с прямым порядком байтов, указывающее количество записей в таблице.
  2. Набор 32-битных целых чисел с прямым порядком байтов. По одному для каждого символа, регистрируя позицию в архиве заголовка файла, содержащего этот символ.
  3. Набор строк с нулевым завершением. Каждый из них представляет собой имя символа и встречается в том же порядке, что и список позиций в части 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 ECOFF, в котором хранится расширенная таблица перекрестных ссылок символов. Этот отсортирован и использует целые числа с прямым порядком байтов. Третья запись - это необязательные данные с длинным именем «//», как в SysV / GNU.

Тонкий архив

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

Пример использования

Чтобы создать архив из файлов 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 class1.o class2.o class3.o

Смотрите также

использованная литература

внешние ссылки