Перейти до вмісту

Ar (Unix)

Очікує на перевірку
Матеріал з Вікіпедії — вільної енциклопедії.
Ar
Типстандартна утиліта UNIX[d] і архіватор[d] Редагувати інформацію у Вікіданих
Ar (Unix)
Розширення:.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».

Деталі формату файлу

[ред. | ред. код]
Діаграма, що показує приклад структури файлу .deb

Формат 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 варіант

[ред. | ред. код]

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]

Варіант System V (або GNU)

[ред. | ред. код]

Програма ar у Unix System V використовує символ '/' (0x2F) для позначення кінця назви файлу; це дозволяє використовувати пробіли без використання розширеного імені файлу. Потім він зберігає кілька розширених імен файлів у розділі даних файлу з назвою "//", на цей запис посилаються майбутні заголовки. Заголовок посилається на розширене ім’я файлу, зберігаючи «/» з наступним десятковим зміщенням на початку імені файлу в розділі даних розширеного імені файлу. Сам формат цього файлу «//» — це просто список довгих імен файлів, кожне з яких розділено одним або кількома символами LF. Зауважте, що десяткові зміщення – це кількість символів, а не номер рядка чи рядка у файлі "//". Зазвичай це другий запис у файлі після таблиці символів, яка завжди є першою.

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

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

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

Спеціальний файл "/" не завершується певною послідовністю; кінцем вважається ситуація, коли було прочитано ім'я останнього символу.

Щоб подолати обмеження розміру файлу в 4 ГіБ, деякі операційні системи, такі як Solaris 11.2 і GNU, використовують таблицю пошуку варіантів. Замість 32-розрядних цілих чисел у таблицях пошуку символів використовуються 64-розрядні цілі числа. Рядок "/SYM64/" замість "/" використовується як ідентифікатор для цієї таблиці [9]

Варіант Windows
[ред. | ред. код]

Варіант 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

Див. також

[ред. | ред. код]

Список літератури

[ред. | ред. код]
  1. а б в г д е TrID — 2003.
  2. Static Libraries. TLDP. Процитовано 3 жовтня 2013.
  3. ar(1) – Linux man page. Процитовано 3 жовтня 2013.
  4. ar.h. www.unix.com. The UNIX and Linux Forums.
  5. bminor/binutils-gdb: archive.c. GitHub (англ.). 16 липня 2022.
  6. [[[:Шаблон:Man/SUS]] ar(Шаблон:Man/SUS)] – Шаблон:Man/SUS
  7. ranlib.h. opensource.apple.com.
  8. [[[:Шаблон:Man/FreeBSD]] ar(Шаблон:Man/FreeBSD)] – Шаблон:Man/FreeBSD
  9. ar.h(3HEAD). docs.oracle.com. Oracle Corporation. 11 листопада 2014. Процитовано 14 листопада 2018.
  10. Pietrek, Matt (April 1998), Under The Hood, Microsoft Systems Journal, архів оригіналу за 24 червня 2007, процитовано 23 серпня 2014
  11. llvm-mirror/llvm: archive.cpp (format detection). GitHub (англ.). Процитовано 10 лютого 2020.
  12. ar. GNU Binary Utilities.

Зовнішні посилання

[ред. | ред. код]