Ar (Unix)
Тип | стандартна утиліта UNIX[d] і архіватор[d] ![]() |
---|---|
Розширення: | .ar [1], .a [1], .lbr [1] або .lib [1] ![]() |
---|---|
MIME-тип: | application/x-archive[1] |
Магічне число: | 213C617263683E[1] ![]() |
ar, (скорочення від англ. archiver) -- утиліта Unix-подібних операційних системах, призначена для групування файлів у вигляді єдиного архівного файлу . Сьогодні ar
зазвичай використовується лише для створення та оновлення статичних бібліотечних файлів, які використовує редактор посилань або компонувальник, а також для створення пакетів .deb для сімейства Debian; його можна використовувати для створення архівів для будь-яких цілей, але він був значною мірою замінений на tar
для цілей, відмінних від статичних бібліотек. [2] Реалізацію ar
містить пакет з GNU Binutils . [3]
У Linux Standard Base (LSB) ar
застарів і, як очікується, зникне в майбутньому випуску цього стандарту. Надане обґрунтування полягало в тому, що «LSB не включає утиліти розробки програмного забезпечення та не визначає формати файлів .o та .a».

Формат ar ніколи не був стандартизований; сучасні архіви базуються на загальному форматі з двома основними варіантами, BSD і System V.
Історично існували інші варіанти включаючи V6, V7, AIX (маленький і великий) і Coherent, які суттєво відрізняються від загального формату.
Загальний формат використовується також у архівах Debian (.deb).
Файл ar починається з глобального заголовка, за яким йдуть заголовок і розділ даних для кожного файлу, що зберігається в ар-файлі.
Кожен розділ даних вирівняний по 16-бітній границі. Якщо він закінчується на непарному зміщенні, заповнювачем слугує символ нового рядка ('\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 і переводи рядків, архів, що містить лише текстові файли, все одно виглядає як текстовий файл.
Члени вирівнюються за парними межами байтів. «Кожен елемент архівного файлу починається з парної межі байтів; якщо необхідно, між файлами вставляється новий рядок. Тим не менше, наведений розмір відображає фактичний розмір файлу без урахування відступів». [4]
Через обмеження довжини і формату імен файлів у варіантах GNU і BSD були розроблені різні методи зберігання довгих імен файлів. Незважаючи на те, що загальний формат не страждає від проблеми 2038 року, багато реалізацій утиліти ar несумісні з прийнятим зараз 64-розрядним кодуванням дати і, можливо, їх доведеться змінити у майбутньому, щоб правильно обробляти лічильники секунд, що перевищують 2147483647. Опис цих розширень можна знайти в libbfd. [5]
Залежно від формату, багато реалізацій ar включають глобальну таблицю символів (вона ж armap, каталог або індекс) для швидкого зв’язування без необхідності сканувати весь архів на наявність символу. POSIX розпізнає цю функцію та вимагає, щоб реалізації ar мали опцію -s
для її оновлення. Більшість реалізацій розміщують його в першому елементі. [6]
BSD ar зберігає імена файлів, доповнені пробілами ASCII справа. Це спричиняє проблеми з пробілами всередині імен файлів. 4.4BSD ar зберігає розширені імена файлів, розміщуючи рядок "#1/", за яким слідує довжина імені файлу в полі імені файлу, і зберігаючи справжню назву файлу перед розділом даних.
Утиліта BSD ar традиційно не займається створенням глобальної таблиці пошуку символів і делегує це завдання окремій утиліті під назвою ranlib, яка вставляє специфічний для архітектури файл під назвою __.
SYMDEF
як перший член архіву. Деякі нащадки ставлять пробіл і «SORTED» після імені, щоб вказати відсортовану версію. [7] 64-розрядний варіант під назвою __.SYMDEF_64
__.SYMDEF_64
існує у ОС Darwin .
Оскільки POSIX додав вимогу для опції -s
як заміну ranlib, проте новіші реалізації BSD ar були переписані, щоб мати цю функцію. FreeBSD, зокрема, відмовилася від формату таблиці SYMDEF і прийняла таблицю стилю System V. [8]
Програма ar у Unix System V використовує символ '/' (0x2F) для позначення кінця назви файлу; це дозволяє використовувати пробіли без використання розширеного імені файлу. Потім він зберігає кілька розширених імен файлів у розділі даних файлу з назвою "//", на цей запис посилаються майбутні заголовки. Заголовок посилається на розширене ім’я файлу, зберігаючи «/» з наступним десятковим зміщенням на початку імені файлу в розділі даних розширеного імені файлу. Сам формат цього файлу «//» — це просто список довгих імен файлів, кожне з яких розділено одним або кількома символами LF. Зауважте, що десяткові зміщення – це кількість символів, а не номер рядка чи рядка у файлі "//". Зазвичай це другий запис у файлі після таблиці символів, яка завжди є першою.
System V ar використовує спеціальну назву файлу "/", щоб позначити, що наступний запис даних містить таблицю пошуку символів, яка використовується в бібліотеках ar для прискорення доступу. Ця таблиця символів складається з трьох частин, які записуються разом як безперервні дані.
- 32-розрядне ціле число big-endian, що вказує кількість записів у таблиці.
- Набір 32-розрядних цілих чисел big-endian. По одному для кожного символу, записуючи позицію в архіві заголовка для файлу, що містить цей символ.
- Набір рядків, що завершуються нулем. Кожен є іменем символу, і зустрічається в тому ж порядку, що й список позицій у частині 2.
Деякі системи System V не використовують формат, описаний вище, для таблиці пошуку символів. Для таких операційних систем, як HP-UX 11.0, ця інформація зберігається в структурі даних на основі формату файлу SOM .
Спеціальний файл "/" не завершується певною послідовністю; кінцем вважається ситуація, коли було прочитано ім'я останнього символу.
Щоб подолати обмеження розміру файлу в 4 ГіБ, деякі операційні системи, такі як Solaris 11.2 і GNU, використовують таблицю пошуку варіантів. Замість 32-розрядних цілих чисел у таблицях пошуку символів використовуються 64-розрядні цілі числа. Рядок "/SYM64/" замість "/" використовується як ідентифікатор для цієї таблиці [9]
Варіант Windows (PE/COFF) базується на варіанті SysV/GNU. Перший запис "/" має такий же макет, що й таблиця символів SysV/GNU. Другий запис — ще один «/», розширення Microsoft, яке зберігає розширену таблицю перехресних посилань символів. Ця таблиця відсортована і використовує цілі числа little-endian. [10] Третій запис — необов’язкові дані довгого імені «//», як у SysV/GNU. [11]
Версія ar
у GNU binutils та Elfutils має додатковий формат «тонкого архіву» з магічним числом!<thin> <тонкий> . Тонкий архів містить лише таблицю символів і посилання на файл. Формат файлу — це, по суті, архів формату System V, де кожен файл зберігається без розділів даних. Кожне ім'я файлу зберігається як "довге" ім'я файлу, і їх потрібно розпізнавати так, ніби це символічні посилання . [12]
Для створення архіву з файлів class1.o , class2.o та 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
- ↑ а б в г д е TrID — 2003.
- ↑ Static Libraries. TLDP. Процитовано 3 жовтня 2013.
- ↑ ar(1) – Linux man page. Процитовано 3 жовтня 2013.
- ↑ ar.h. www.unix.com. The UNIX and Linux Forums.
- ↑ bminor/binutils-gdb: archive.c. GitHub (англ.). 16 липня 2022.
- ↑ Шаблон:Man/SUS –
- ↑ ranlib.h. opensource.apple.com.
- ↑ Шаблон:Man/FreeBSD –
- ↑ ar.h(3HEAD). docs.oracle.com. Oracle Corporation. 11 листопада 2014. Процитовано 14 листопада 2018.
- ↑ Pietrek, Matt (April 1998), Under The Hood, Microsoft Systems Journal, архів оригіналу за 24 червня 2007, процитовано 23 серпня 2014
- ↑ llvm-mirror/llvm: archive.cpp (format detection). GitHub (англ.). Процитовано 10 лютого 2020.
- ↑ ar. GNU Binary Utilities.
- Шаблон:Man/SUS : create and maintain library archives –
- man по користувацьким командам Plan 9 (англ.) – сторінка довідки
- Шаблон:Man/Inferno –
- man про користувацькі команди GNU/Linux (англ.) – сторінка довідки
- Шаблон:Man/FreeBSD –
- Шаблон:Man/v7 –
- Шаблон:Man/FreeBSD—an account of Unix formats –
- Chapter 4: Relocatable Libraries. The 32-bit PA-RISC Run-time Architecture Document, HP-UX 11.0 Version 1.0 (англ.). Hewlett-Packard. 1997.