Утилита управления архивами объектных файлов GNU AR

1. Назначение программы ar

Программа GNU ar позволяет создавать, модифицировать и извлекать

файлы из архивов. Архив представляет собой отдельный файл, содержащий

набор других файлов в структуре, позволяющей извлекать отдельные

исходные файлы, называемые членами архива.

Содержимое исходного файла, его режимы (права доступа), время

создания/модификации, владелец и группа сохранены в архиве, и могут

быть восстановлены во время извлечения файла из архива.

GNU поддерживает архивы с именами членов любой длины; однако, в

зависимости от того, как ar скофигурирован в вашей системе,

ограничение на длину имен членов может быть наложено для обеспечения

совместимости с форматами архивов поддерживаемыми другими средствами.

В таком случае, чаще всего длина имени ограничена 15 символами (как

правило, для форматов a.out) или 16 символами (как правило, для

форматов coff).

Программа ar считается входящей в состав набора Bin Utility

(набор средств для работы с двоичными файлами кода в разных форматах),

поскольку архивы такого рода как правило используются в качестве

библиотек, содержащих частоиспользуемые процедуры.

При использовании модификатора ‘s’, ar создает индекс к символам,

определенным в содержащихся в архиве перемещаемых объектных модулях.

После того, как этот индекс будет однажды создан, он обновляется в

архиве каждый раз, когда ar производит изменения в содержимом архива

(за исключением операции быстрого обновления ‘q’, которая не выполняет

обновления индекса). Архив с таким индексом ускоряет процесс

компоновки программы с использованием библиотеки и позволяет

библиотечным процедурам вызывать друг друга вне зависимости от их

расположения в архиве.

Вы можете использовать ‘nm -s’ или ‘nm –print-armap’ для

просмотра этой таблицы индекса. Если архив не имеет таблицы индекса,

для ее добавления может быть использована другой вариант программы ar,

называемый ranlib.

GNU ar разрабатывался совместимым с двумя различными средствами.

Управлять работой ar можно из командной строки, так же, как это

делается в различных разновидностях программы ar на системах Unix.

Кроме этого, можно указать в командной строке опцию ‘-M’; в этом

случае ar принимает со стандартного входа MRI-скрипт, определяющий

выполняемые библиотекарем действия. Последний режим соответствует

функционированию программы-библиотекаря, разработанной Microtec

Research Inc.

2. Управление ar при помощи командной строки.

Синтаксис командной строки:

ar [-]p[mod [relpos]] archive [member...]

Когда используется ar в стиле Unix, ar требует для выполнения по

крайней мере 2 аргумента: один ключевой спецификатор операции

(возможно дополненный другими ключевыми буквами-модификаторами

операции), и имя архива, над которым необходимо выполнять действия.

Большинство операций могут принимать дополнительные аргуметы,

определяющие имена конкретных файлы, над которыми выполняются

связанные с архивом операции.

GNU ar позволяет смешивать код операции p и флаги модификаторов в

любом порядке внутри первого аргумента командной строки.

При желании первому аргументу командной строки может

предшествовать тире.

Ключевая буква p определяет операцию, которую необходимо

выполнить; она может быть любой из ниже перечисленных, но только одной

из них:

d Удаление модуля из архива.

Необходимо указать имена модулей, которые должны быть удалены, в

списке member…; архив останется нетронутым, если не было

установленно имя файла для удаления.

m Перемещение членов архива.

Порядок членов в архиве может влиять на то, как программы будут

слинкованы, если символ определен более чем в одном члене. Если не

указаны модификаторы совместно с m, то любые члены, определенные в

поле members, будут перенесены в конец архива; вы можете также

использовать модификаторы ‘a’,'b’ или ‘i’ для переноса в определенное

место архива.

p Печать указанных членов архива в стандартный файл вывода.

Если определен модификатор ‘v’, то перед печатью содержимого

члена в стандартный файл вывода показывается его имя.

Если среди аргументов в командной строке не указан ни один член,

то будут напечатаны все файлы архива.

q Быстрое добавление.

Выполняется добавление файлов members … в конец архива без

проверки для замещения.

Модификаторы ‘a’ ,’b',’i’ не влияют на выполнение операции; новые

члены всегда добавляются в конец архива.

Модификатор ‘v’ позволяет вывести список всех добавленных файлов.

Поскольку для этой операции важна скорость выполнения, индексная

таблица символов архива не обновляется, даже если она уже существует;

для обновления могут быть использованы команды ‘ar s’ или ‘ranlib’.

r Добавление файлов, перечисленных в списке member… в архив (с

замещением).

Эта операция отличается от ‘q’ тем, что любые ранее существующие

члены удаляются, если их имена совпадают с добавляемыми.

Если какой-нибудь файл в списке member… не существует, ar

выдаст сообщение об ошибке и оставит не тронутыми все члены архива с

таким именем.

По умолчанию, новые члены будут добавлены в конец файла; однако

можно использовать один из модификаторов ‘a’, ‘b’ или ‘i’, чтобы

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

существующих членов архива.

Модификатор ‘v’, используемый вместе с этой операцией, приводит к

выводу строк, каждая из которых содержит имя вставляемого файла и одну

из букв ‘a’ или ‘r’, показывающую, был ли файл добавлен (ни один из

старых членов не был удален) или замещен.

t Показывает таблицу с полным содержанием архива или с теми

файлами, перечисленными в поле member… , которые содержатся в

архиве. По умолчанию выводится только имя члена. Для того, чтобы

посмотреть также режимы (права доступа), время модификации, владельца,

группу и размер, следует использовать модификатор ‘v’.

Если аргументы member… не указаны, будет выведен список всех

файлов, содержащихся в архиве.

Если в архиве (скажем, b.a) существуют файлы с одинаковым именем

(скажeм, fie), то командой ‘ar t b.a fie’ будет показано только первое

вхождение; для того, чтобы увидеть все, необходимо запросить полный

листинг содержания, в нашем примере ‘ar t b.a’.

x Извлечение членов (указанных в списке member…) из архива.

Для отображения имени каждого извлекаемого файла следует

использовать модификатор ‘v’ вместе с этой операцией. Если извлекаемые

члены не указаны в командной строке, то из архива будут извлечены все

файлы.

Непосредственно за ключевой буквой p в командной строке могут

следовать модификаторы (mod), указавающие различные особенности в

исполнении операции:

a Добавление новых файлов в архив после существующих. Если

используется модификатор ‘a’, имя существующего члена архива должно

быть задано посредством указания аргумента relpos перед именем

файла-архива.

b Добавление новых файлов в архив перед сущестующими. Если

используется модификатор ‘b’, имя существующего члена архива должно

быть задано посредством указания аргумента relpos перед именем

файла-архива. (Аналогично i)

c Создание архива. Если архив, заданный аргументом archive, не

существует, он будет создан при попытке изменения его содержимого.

Предупреждение о создании нового архива будет выдано не смотря на

указание этого модификатора.

f Укорачивает имена в архиве. Вообще говоря, GNU ar может

оперировать с именами любой длины. Однако, наличие длинных имен может

привести к несовместимости с «родными» версиями программы ar в

некоторых системах. В этом случае модификатор ‘f’ может быть

использован для укорачивания имен файлов во время вставки их в архив.

i Добавление новых файлов в архив перед сущестующими. Если

используется модификатор ‘i’, имя существующего члена архива должно

быть задано посредством указания аргумента relpos перед именем

файла-архива. (Аналогично b)

l Этот модификатор распознается, но не используется.

o Сохраняет дату и время модификации членов при их извлечении из

архива. Если этот модификатор не используется, файлы, извлеченные из

архива, будут иметь дату и время извлечения.

s Записывает индекс объектных файлов в архив или обновляет

существующий, даже если не было никаких изменений в архиве. Этот

модификатор может быть использован как с любой операцией, так и сам по

себе. Исполнение команды ‘ar s’ над архивом эквивалентно исполнению

‘ranlib’ над тем же архивом.

u По умолчанию, ‘ar r’ … вставляет все указанные файлы.

Модификатор ‘u’ позволяет вставить только те файлы, время модификации

которых позже, чем время модификации члена архива. Модификатор ‘u’

может быть использован только совместно с операцией ‘r’ (замена).

Комбинация ‘qu’ не поддерживается, поскольку проверка времен

модификации привела бы к значительному замедлению работы и потере

преимуществ команды q.

v Использование этого модификатора приводит к «говорливому»

исполнению команд. Большинство команд при использовании модификатора

‘v’ показывают дополнительную информацию, такую как имена

обрабатываемых файлов.

V Этот модификатор предназначен для вывода номера версии

программы ar.

3. Управление ar с помощью скрипта.

ar -M [ < script ]

Если программа ar вызывается только с опцией ‘-M’, то управление

ее работой осуществляется с помощью достаточно простого командного

языка. В случае, если стандартным вводом программы ar в этом режиме

является терминал, она работает в интерактивном режиме. В этом случае

ar выдает приглашение для ввода (подсказка ‘AR>’), и продолжает работу

даже после ошибок. Если стандартный вводом для ar является

скрипт-файл, то подсказки не выдаются и ar прекращает работу (с

ненулевым кодом завершения) в случае любой ошибки.

Командный язык ar не эквивалентен по возможностям опциям

командной строки; более того, он имеет меньшую функциональность.

Единственное предназначение командного языка состоит в упрощении

перехода к использованию GNU ar разработчиками, которые уже имеют

скрипты, написанные для программы-библиотекаря MRI.

Командный язык ar имеет следующий синтаксис:

* команды распознаются как в верхнем, так и в нижнем регистре;

например, LIST – это то же самое что и list. В последующих описаниях

команды для удобства приводятся в верхнем регистре.

* Строка может содержать только одну команду; команда должна быть

первым словом в строке

* Допустимо наличие пустых строк. Пустые строки игнорируются.

* Поддерживаются комментарии: текст после символов ‘*’ и’;’

игнорируется.

* Когда в качестве аргумента команд требуется использование

списка имен, отдельные имена могут разделяться запятыми или пробелами.

Для ясности, при описании команд будут использоваться запятые в

качестве разделителей.

* Символ ‘+’ используется как признак продолжения строки. Если

‘+’ появляется в конце строки, то текст на следующей строке

рассматривается как продолжение текущей команды.

Далее перечислены команды, которые могут быть использованы в

скриптах для ar. Следующие три из этих команд имеют специальное

назначение:

OPEN или CREATE определяют текущий архив, который является

временным файлом, используемым большинством других команд.

SAVE принимает изменения, определенные скриптом. До исполнения

команды SAVE, все предшествующие команды осуществляют изменения во

временной копии текущего архива.

ADDLIB archive

ADDLIB archive (module, module , … module)

Добавляет в текущий архив все содержимое архива archive,

заданного параметром, или тех модулей архива archive, которые

перечислены в списке модулей в скобках.

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

ADDMOD member,member,…,member

Каждый файл member, перечисленный в списон, добавляется как

модуль в текущий архив.

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

CLEAR

Исполнение этой команды приводит к потере содержимого текущего

архива, отменяя результат выполнения всех операций, выполненных после

последнего исполнения команды SAVE. Может быть выполнена без

какого-либо эффекта, даже если текущий архив не определен.

CREATE archive

Создает архив и делает его текущим архивом, который будет

использоваться при исполнении большинства других команд. Новый архив

создается с временным именем; он будет сохранен под именем, указанным

как аргумент команды archive, только когда будет выполнена команда

SAVE. Можно перекрывать существующие архивы; содержимое файла с

существующим архивом будет потерято только после выполнения команды

SAVE.

DELETE module,module,…,module

Выполнение этой команды приводит к удалению из текущего архива

модулей, перечисленных в списке аргументов. Результат выполнения этой

команды эквивалентен следующему использованию ar из командной строки:

ar -d archive module module …

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

DIRECTORY archive (module,…,module)

DIRECTORY archive (module,…,module) outputfile

Перечисляет все модули, которые указаны в списке в скобках и

содержащиеся в архиве. Формат вывода определяется отдельной командой

VERBOSE: когда подробная выдача выключена, результат будет таким же,

как после исполнения команды ‘ar -t archive module …’ Когда

подробная выдача включена, список имеет такой же вид, как результат

исполнения команды ar -tv archive module…

По умолчанию вывод производится в поток стандартного вывода;

однако, если указано имя файла outputfile в качестве последнего

аргумента, ar направляет вывод в этот файл.

END

Выполнение этой команды приводит к прекращению работы программы

ar и возврату кода выхода 0, показывающего успешное завершение.

Изменения, произведенные над текущим архивом после последнего

исполнения команды SAVE, будут потеряны.

EXTRACT module,..,module

Выполнение этой команды приводит к извлечению модулей, имена

которых перечислены в списке аргументов, из текущего архива и записи в

текущий директорий в виде отдельных файлов. Результат выполнения этой

команды эквивалентен команде

ar -x archive module…

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

LIST

Команда показывает полное подробное содержимое текущего архива

(вне зависимости от значения флага VERBOSE). Аналог этой команды при

использовании ar из командной строки:

ar tv archive

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

OPEN archive

Открывает существующий архив для использования его в качестве

текущего архива, используемого большинством команд. Результат

выполнения последующих команд не приведет к изменению файла archive до

тех пор, пока не будет выполнена команда SAVE.

REPLACE module,…

В текущем архиве выполняется замещение существующих модулей,

перечисленных в списке аргументов команды, содержимым файлов,

находящихся в текущем каталоге. Для того, чтобы эта команда была

выполнена без ошибок, необходимо существование как модулей в архиве с

указанными именами, так и соответствующих файлов.

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.

VERBOSE

Изменяет значение внутреннего флага, управляющего форматом вывода

по команде DIRECTORY.

SAVE

Приводит к сохранению произведенных изменений текущего архива, в

файле с именем, указанным в предшествующей команде CREATE или OPEN.

Перед использованием этой команды необходимо исполнить команду

OPEN или CREATE.