Введение в архиватор ar
При проектировании и сборке программного обеспечения на C/C++ в среде Linux критически важную роль играет формирование статических библиотек с расширением .a. Ключевым инструментом для объединения разрозненных объектных модулей в единый архив выступает утилита ar. В данном руководстве подробно разобран весь жизненный цикл статической библиотеки: от компиляции исходников и упаковки модулей до извлечения компонентов, построения индекса символов с помощью ranlib и предотвращения типичных сбоев линковки.
Развертывание тестового стенда и сборка объектных файлов (.o)
Для подготовки рабочего окружения установим компилятор gcc, а также набор низкоуровневых системных утилит binutils, куда входит сам архиватор ar, выполнив команду apt-get update -qq && apt-get install -y binutils gcc.

Сконфигурируем изолированную директорию для экспериментов и перейдем в нее с помощью вызова mkdir -p /tmp/ar_demo && cd /tmp/ar_demo.

Сформируем исходный файл математической функции сложения, направив код непосредственно в файл командой echo 'int add(int a, int b) { return a + b; }' > math_add.c.

Аналогичным образом создадим второй вспомогательный модуль с операцией вычитания через инструкцию echo 'int sub(int a, int b) { return a - b; }' > math_sub.c.

Чтобы получить независимые бинарные объектные файлы без этапа компоновки исполняемого файла, скомпилируем написанные си-файлы флагом -c, выполнив gcc -c math_add.c math_sub.c.

Убедимся в успешной генерации модулей math_add.o и math_sub.o в текущем каталоге при помощи команды ls -l *.o.

Создание статического архива (.a) и упаковка модулей (ar rcs)
Вернемся в базовую директорию сборки посредством вызова cd /tmp/ar_demo.

Скомпонуем сгенерированные объектные файлы в готовую статическую библиотеку libmath.a, запустив команду ar rcs libmath.a math_add.o math_sub.o.
Здесь модификатор r отвечает за вставку или замену файлов внутри архива, ключ c подавляет предупреждение и создает новый файл библиотеки при его отсутствии, а параметр s генерирует глобальную таблицу символов прямо во время сборки.

Оценим размер полученного архива и атрибуты доступа в удобном для восприятия формате, вызвав ls -lh libmath.a.

Инспекция содержимого библиотеки и аудит символов (ar t, nm)
Перед проверкой состава архива повторно зафиксируем рабочее место вызовом cd /tmp/ar_demo.

Для вывода детального списка вложенных модулей, включая временные метки, права и объемы каждого элемента в libmath.a, выполним ar tv libmath.a.
Комбинация флагов t (просмотр оглавления архива) и v (подробный режим) позволяет мгновенно проверить целостность упакованных файлов.

Чтобы удостовериться в корректности экспортируемых функций и готовности библиотеки к этапу компоновки, запустим анализ символов с флагом индекса: nm -s libmath.a.
Утилита nm с опцией -s отображает не только отдельные секции каждого файла, но и сводный индекс архива, по которому линкер быстро находит адреса внешних вызовов.

Извлечение и удаление целевых объектов из архива (ar x, ar d)
Создадим отдельную подпапку для безопасного распаковывания компонентов, применив команду cd /tmp/ar_demo && mkdir -p extracted.

Перейдем в созданный каталог, извлечем из библиотеки конкретно модуль math_add.o и отобразим результат с помощью цепочки cd extracted && ar x ../libmath.a math_add.o && ls -l.
Действие x извлекает указанный член архива в текущую рабочую директорию, оставляя исходный файл .a неизменным.

Возвратимся на уровень выше к основному проекту командой cd /tmp/ar_demo.

Если требуется исключить устаревший или ненужный функционал (например, модуль math_sub.o), воспользуемся операцией удаления: ar d libmath.a math_sub.o.
Опция d физически вырезает указанный объектный блок из контейнера библиотеки.

Убедимся, что внутри архива остался исключительно модуль сложения, запросив краткий перечень содержимого через ar t libmath.a.

Тонкости продакшена: индексация символов и устранение ошибок линковки
Перейдем в рабочую среду для моделирования классической проблемы с рассинхронизацией индексов: cd /tmp/ar_demo.

Внедрим модуль math_sub.o обратно в архив без автоматического обновления таблицы символов, запустив ar r libmath.a math_sub.o.
Если опустить флаг s, архив будет изменен, но внутренний индекс останется неактуальным, из-за чего компоновщик (ld) не сможет разрешить вызовы добавленных функций и выдаст ошибку undefined reference.

Для ручной перегенерации устаревшего или поврежденного индекса символов применим утилиту ranlib libmath.a.
Команда ranlib перестраивает служебную структуру заголовка библиотеки, гарантируя корректное связывание всех внешних идентификаторов на этапе линковки.

Убедимся, что таблица символов успешно восстановлена и покрывает все функции библиотеки, повторно выполнив проверку: nm -s libmath.a.
Секция Archive index наглядно подтверждает, что обе функции (add и sub) зарегистрированы в глобальном реестре библиотеки.

Мы подробно рассмотрели практическое применение утилиты ar в Linux: от сборки простых модулей до тонкостей сопровождения индексных таблиц статических библиотек.
Понимание этих механизмов позволяет уверенно отлаживать сложные сборочные пайплайны и безошибочно структурировать C/C++ проекты любого масштаба.