stringtranslate.com

ар (Unix)

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

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

BSD-вариант

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 (или GNU)

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

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

  1. 32-битное целое число с обратным порядком байтов, указывающее количество записей в таблице.
  2. Набор 32-битных целых чисел с прямым порядком байтов. По одному для каждого символа, записывающий позицию в архиве заголовка файла, содержащего этот символ.
  3. Набор строк с нулевым окончанием. Каждая из них является именем символа и встречается в том же порядке, что и список позиций в части 2.

Некоторые системы System V не используют описанный выше формат для таблицы поиска символов. Для операционных систем, таких как HP-UX 11.0, эта информация хранится в структуре данных на основе формата файла SOM .

Специальный файл «/» не завершается определенной последовательностью; конец предполагается после прочтения последнего имени символа.

Чтобы преодолеть ограничение на размер файла в 4 GiB, некоторые операционные системы, такие как 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 имеет дополнительный формат «тонкого архива» с магическим числом !<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

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

Ссылки

  1. ^ ab "application/x-archive". Архивировано из оригинала 2019-12-08 . Получено 2019-03-11 .
  2. ^ ab "ar(1) – Linux man page" . Получено 3 октября 2013 г. .
  3. ^ "Статические библиотеки". TLDP . Получено 3 октября 2013 г.
  4. ^ Linux Standard Base Core Specification, версия 4.1, Глава 15. Команды и утилиты > ar
  5. ^ ab Levine, John R. (2000) [октябрь 1999]. "Глава 6: Библиотеки". Линкеры и загрузчики. Серия Morgan Kaufmann по программной инженерии и программированию (1-е изд.). Сан-Франциско, США: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382. Архивировано из оригинала 2012-12-05 . Получено 2020-01-12 .Код: [1][2] Опечатки: [3]
  6. ^ ab Страница руководства для формата файла NET/2 ar
  7. ^ "ar.h". www.unix.com . Форумы UNIX и Linux.
  8. ^ "bminor/binutils-gdb: archive.c". GitHub . 16 июля 2022 г.
  9. ^ ar  – Справочник по оболочкам и утилитам, Единая спецификация UNIX , версия 4 от The Open Group
  10. ^ Страница руководства для утилиты NET/2 ranlib
  11. ^ Страница руководства для формата файла NET/2 ranlib
  12. ^ "ranlib.h" .opensource.apple.com .
  13. ^ ar(5)  –  Руководство по форматам файлов FreeBSD
  14. ^ "ar.h(3HEAD)". docs.oracle.com . Корпорация Oracle. 11 ноября 2014 г. Получено 14 ноября 2018 г.
  15. Pietrek, Matt (апрель 1998 г.), «Under The Hood», Microsoft Systems Journal , заархивировано из оригинала 24.06.2007 г. , извлечено 23.08.2014 г.
  16. ^ "llvm-mirror/llvm: archive.cpp (определение формата)". GitHub . Получено 10 февраля 2020 г. .
  17. ^ "ar". Двоичные утилиты GNU .

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