ар (Unix)
Оригинальный автор(ы) | Кен Томпсон , Деннис Ричи ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные с открытым исходным кодом и коммерческие разработчики разработчики |
Первоначальный выпуск | 3 ноября 1971 г |
Написано в | С |
Операционная система | Unix , Unix-подобные , V , Plan 9 , Inferno |
Платформа | Кросс-платформенный |
Тип | Команда |
Лицензия | План 9: МОЯ лицензия |
Расширение имени файла | |
---|---|
Тип интернет-СМИ |
приложение/x-архив [1] |
Магическое число | !<арка> |
Тип формата | формат архива |
Контейнер для | обычно объектные файлы ( .о ) |
Стандартный | Не стандартизировано, существует несколько вариантов. |
Открытый формат ? | Да [2] |
Архиватор файл , также известный как ar , представляет собой утилиту Unix , которая поддерживает группы файлов как один архивный . Сегодня, ar
обычно используется только для создания и обновления файлов статических библиотек , которые использует редактор ссылок или компоновщик , а также для создания пакетов .deb для семейства Debian ; его можно использовать для создания архивов для любых целей, но он в значительной степени заменен tar
для целей, отличных от статических библиотек. [3] Реализация ar
включен как один из GNU Binutils . [2]
В стандартной базе Linux (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).
Компенсировать | Длина | Имя | Формат |
---|---|---|---|
0 | 16 | Идентификатор файла | ASCII-код |
16 | 12 | Временная метка изменения файла (в секундах) | Десятичный |
28 | 6 | Идентификатор владельца | Десятичный |
34 | 6 | Идентификатор группы | Десятичный |
40 | 8 | Режим файла (тип и разрешение) | Восьмеричный |
48 | 10 | Размер файла в байтах | Десятичный |
58 | 2 | Конечные символы | 0x60 0x0A |
Поскольку заголовки содержат только печатные символы ASCII и переводы строк, архив, содержащий только текстовые файлы, по-прежнему выглядит как текстовый файл.
Члены выравниваются по четным границам байтов. «Каждый элемент архивного файла начинается с четной границы байта; при необходимости между файлами вставляется новая строка. Тем не менее, указанный размер отражает фактический размер файла без учета заполнения». [7]
Из-за ограничений длины и формата имени файла в вариантах GNU и BSD были разработаны разные методы хранения длинных имен файлов. Хотя общий формат не страдает от проблемы 2038 года , многие реализации утилиты ar вносят изменения, и в будущем, возможно, их потребуется изменить для правильной обработки временных меток, превышающих 2147483647. Описание этих расширений можно найти в libbfd. [8]
В зависимости от формата многие реализации ar включают глобальную таблицу символов (также известную как ArmAP, каталог или индекс) для быстрого связывания без необходимости сканирования всего архива в поисках символа. POSIX распознает эту особенность и требует, чтобы реализации AR имели -s
возможность его обновления. В большинстве реализаций его помещают в первую запись файла. [9]
Вариант BSD [ править ]
BSD ar хранит имена файлов, дополненные пробелами ASCII справа. Это вызывает проблемы с пробелами внутри имен файлов. 4.4BSD ar сохраняет расширенные имена файлов, помещая строку «#1/», за которой следует длина имени файла в поле имени файла, и сохраняя реальное имя файла перед разделом данных. [6]
Утилита BSD ar традиционно не занимается построением глобальной таблицы поиска символов и делегирует эту задачу отдельной утилите с именем ranlib . [10] который вставляет файл с именем, зависящим от архитектуры __.SYMDEF
в качестве первого члена архива. [11] Некоторые потомки ставят пробел и «SORTED» после имени, чтобы указать отсортированную версию. [12] 64-битный вариант под названием __.SYMDEF_64
существует на Дарвине .
Поскольку в POSIX добавлено требование для -s
в качестве замены ranlib, однако новые реализации BSD ar были переписаны, чтобы иметь эту функцию. FreeBSD, в частности, отказалась от формата таблиц SYMDEF и приняла таблицы в стиле System V. [13]
System V (or GNU) variant [ edit ]
Системная переменная использует символ «/» (0x2F) для обозначения конца имени файла; это позволяет использовать пробелы без использования расширенного имени файла. Затем он сохраняет несколько расширенных имен файлов в разделе данных файла с именем «//», на эту запись ссылаются будущие заголовки. Заголовок ссылается на расширенное имя файла, сохраняя «/», за которым следует десятичное смещение в начале имени файла в разделе данных расширенного имени файла. Формат этого файла "//" представляет собой просто список длинных имен файлов, каждое из которых разделено одним или несколькими символами LF. Обратите внимание, что десятичные смещения представляют собой количество символов, а не номер строки или строки в файле «//». Обычно это вторая запись в файле после таблицы символов, которая всегда является первой.
System V ar использует специальное имя файла «/», чтобы обозначить, что следующая запись данных содержит таблицу поиска символов, которая используется в библиотеках ar для ускорения доступа. Эта таблица символов состоит из трех частей, которые записываются вместе как смежные данные.
- 32-битное целое число с прямым порядком байтов, указывающее количество записей в таблице.
- Набор 32-битных целых чисел с прямым порядком байтов. По одному на каждый символ, записывая позицию в архиве заголовка файла, содержащего этот символ.
- Набор строк с нулевым завершением. Каждый из них представляет собой имя символа и встречается в том же порядке, что и список позиций в части 2.
Некоторые системы System V не используют описанный выше формат таблицы поиска символов. В таких операционных системах, как HP-UX 11.0, эта информация хранится в структуре данных на основе формата файла SOM .
Специальный файл «/» не заканчивается определенной последовательностью; конец предполагается после прочтения последнего имени символа.
Чтобы преодолеть ограничение размера файла в 4 ГиБ, некоторые операционные системы, такие как Solaris 11.2 и GNU, используют вариантную таблицу поиска. Вместо 32-битных целых чисел в таблицах поиска символов используются 64-битные целые числа. Строка «/SYM64/» вместо «/» используется в качестве идентификатора этой таблицы. [14]
Вариант для Windows [ править ]
Вариант Windows (PE/COFF) основан на варианте SysV/GNU. Первая запись «/» имеет тот же макет, что и таблица символов SysV/GNU. Вторая запись — это еще один «/», расширение Microsoft, в котором хранится расширенная таблица перекрестных ссылок символов. Этот отсортирован и использует целые числа с прямым порядком байтов. [5] [15] Третья запись — это необязательные данные длинного имени «//», как в SysV/GNU. [16]
Тонкий архив [ править ]
Версия ar
в GNU binutils и Elfutils есть дополнительный формат «тонкого архива» с магическим числом. !<тонкий> . Тонкий архив содержит только таблицу символов и ссылки на файл. Формат файла по сути представляет собой архив формата System V, где каждый файл хранится без разделов данных. Каждое имя файла сохраняется как «длинное» имя файла, и оно должно разрешаться так, как если бы оно было символической ссылкой . [17]
Пример использования [ править ]
Создать архив из файлов класс1.о , класс2.о , class3.o , будет использована следующая команда:
ar rcs libclass.a class1.o class2.o class3.o
Линкеры Unix, обычно вызываемые через C. компилятор cc
, умею читать 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
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: а б «приложение/x-архив» . Архивировано из оригинала 08.12.2019 . Проверено 11 марта 2019 г.
- ^ Jump up to: а б «ar(1) – справочная страница Linux» . Проверено 3 октября 2013 г.
- ^ «Статические библиотеки» . ТЛДП . Проверено 3 октября 2013 г.
- ^ Стандартная базовая спецификация Linux, версия 4.1, Глава 15. Команды и утилиты> ar
- ^ Jump up to: а б Левин, Джон Р. (2000) [октябрь 1999 г.]. «Глава 6: Библиотеки» . Линкеры и загрузчики . Серия Моргана Кауфмана по разработке программного обеспечения и программированию (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0 . OCLC 42413382 . Архивировано из оригинала 5 декабря 2012 г. Проверено 12 января 2020 г. Код: [1] [2] Ошибки: [3]
- ^ Jump up to: а б Страница руководства для формата файла NET/2 ar
- ^ "аааа" . www.unix.com . Форумы UNIX и Linux.
- ^ «bminor/binutils-gdb: archive.c» . Гитхаб . 16 июля 2022 г.
- ^ Единая спецификация UNIX , версия 4 от Open Group. – Справочник по оболочке и утилитам,
- ^ Страница руководства для утилиты NET/2 ranlib.
- ^ Страница руководства для формата файла ranlib NET/2.
- ^ "ranlib.h" . opensource.apple.com .
- ^ FreeBSD по форматам файлов Руководство –
- ^ "ar.h(3HEAD)" . docs.oracle.com . Корпорация Оракл. 11 ноября 2014 года . Проверено 14 ноября 2018 г.
- ^ Пьетрек, Мэтт (апрель 1998 г.), «Under The Hood» , Microsoft Systems Journal , заархивировано из оригинала 24 июня 2007 г. , получено 23 августа 2014 г.
- ^ «llvm-mirror/llvm: archive.cpp (определение формата)» . Гитхаб . Проверено 10 февраля 2020 г.
- ^ "ар" . Двоичные утилиты GNU .
Внешние ссылки [ править ]
- Единая спецификация UNIX , Версия 4 от The Open Group : создавать и поддерживать архивы библиотек – Справочник по Shell и Utilities,
- Plan 9 , том 1 Руководство программиста –
- Inferno по общим командам Руководство –
- Linux пользователя по командам Руководство –
- FreeBSD по основным командам Руководство –
- Unix версии 7. программиста Руководство –
- FreeBSD форматам файлов Руководство по — описание форматов Unix. –
- Документ об 32-битной архитектуре времени выполнения PA-RISC, HP-UX 11.0, версия 1.0, Hewlett-Packard, 1997.
См. главу 4: Перемещаемые библиотеки . Доступно по адресу [4] (devresource.hp.com).