Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Подробная информация о формате файла [ править ]

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

Формат 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, каталог или индекс) для быстрого связывания без необходимости сканировать весь архив на предмет наличия символа. POSIX распознает эту функцию и требует, чтобы реализации ar имели -sвозможность ее обновления. Большинство реализаций помещают его в первую запись файла. [9]

Вариант BSD [ править ]

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

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

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

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

Вариант для Windows [ править ]

Вариант Windows (PE / COFF) основан на варианте SysV / GNU. Первая запись «/» имеет ту же структуру, что и таблица символов SysV / GNU. Вторая запись - это еще один символ «/», расширение Microsoft ECOFF, в котором хранится расширенная таблица перекрестных ссылок символов. Этот отсортирован и использует целые числа с прямым порядком байтов. [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 class1.o class2.o class3.o

См. Также [ править ]

  • .deb
  • Форматы архивов
  • Список команд Unix

Ссылки [ править ]

  1. ^ a b "приложение / x-архив" . Проверено 11 марта 2019 .
  2. ^ a b "ar (1) - справочная страница Linux" . Проверено 3 октября 2013 года .
  3. ^ «Статические библиотеки» . TLDP . Проверено 3 октября 2013 года .
  4. ^ Стандартная базовая спецификация ядра Linux, версия 4.1, глава 15. Команды и утилиты> ar
  5. ^ a b Левин, Джон Р. (2000) [октябрь 1999]. «Глава 6: Библиотеки» . Линкеры и загрузчики . Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0. OCLC  42413382 . Архивировано 05 декабря 2012 года . Проверено 12 января 2020 .Код: [1] [2] Ошибки: [3]
  6. ^ a b Справочная страница для формата файла NET / 2 ar
  7. ^ "ar.h" . www.unix.com . Форумы UNIX и Linux.
  8. ^ "bminor / binutils-gdb: archive.c" . GitHub .
  9. ^ ar  - Справочник по командам и утилитам, спецификация Single UNIX , выпуск 7 от The Open Group
  10. ^ Справочная страница для утилиты Runlib NET / 2
  11. ^ Справочная страница для формата файла ранлиб NET / 2
  12. ^ "ranlib.h" . opensource.apple.com .
  13. ^ ar(5)  -  Руководство по форматам файлов FreeBSD
  14. ^ "ar.h (3HEAD)" . docs.oracle.com . Корпорация Oracle. 11 ноября 2014 . Проверено 14 ноября 2018 года .
  15. ^ Питрек, Мэтт (апрель 1998 г.), «Под капотом» , Microsoft Systems Journal , заархивировано из оригинала 24 июня 2007 г. , извлечено 23 августа 2014 г.
  16. ^ "llvm-mirror / llvm: archive.cpp (определение формата)" . GitHub . Дата обращения 10 февраля 2020 .
  17. ^ "ар" . Двоичные утилиты GNU .

Внешние ссылки [ править ]

  • ar: создавать и поддерживать архивы библиотек - Справочник по командам и служебным программам, Спецификация Single UNIX , Выпуск 7 от The Open Group
  • ar(1) -  Руководство программиста Plan 9 , том 1
  • ar(1) -  Руководство по общим командам Inferno
  • ar(1) -  Руководство по командам пользователя Linux
  • ar(1) -  Руководство по основным командам FreeBSD
  • ar(1) -  Руководство программиста Unix версии 7
  • ar(5) -  FreeBSD File Formats Manual - учет форматов Unix
  • 32-разрядный документ архитектуры времени выполнения PA-RISC, HP-UX 11.0, версия 1.0, Hewlett-Packard, 1997.
    См. Главу 4: Перемещаемые библиотеки . Доступно на [4] (devresource.hp.com)