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

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. 1 2 3 4 5 6 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. ↑ [ https://pubs.opengroup.org/onlinepubs/9799919799/utilities/ar.html ar()] –  Shell and Utilities Reference, The Single UNIX Specification, Version 5 from The Open Group
  7. ↑ ranlib.h. opensource.apple.com. Архів оригіналу за 27 лютого 2021. Процитовано 4 березня 2025.
  8. ↑ [[[:Шаблон:Man/FreeBSD]] ar(Шаблон:Man/FreeBSD)] – Шаблон:Man/FreeBSD
  9. ↑ ar.h(3HEAD). docs.oracle.com. Oracle Corporation. 11 листопада 2014. Процитовано 14 листопада 2018.
  10. ↑ Pietrek, Matt (Квітень 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.

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

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

https://pubs.opengroup.org/onlinepubs/9799919799/utilities/ar.html ar()]: create and maintain library archives –  Shell and Utilities Reference, The Single UNIX Specification, Version 5 from The Open Group