#linux #gcc #indexing #archive
#linux #gcc #индексирование #Архив
Вопрос:
На странице руководства ranlib написано:
ОПИСАНИЕ ranlib генерирует индекс содержимого архива и сохраняет его в архиве. В индексе перечислены все символы, определенные членом архива, который является перемещаемым объектным файлом.
Ну, я попытался скомпилировать архивный файл, как показано ниже:
$ cat o.c
#include<stdio.h>
int f(){
printf("hellon");
return 2;
}
gcc -o o.o -c o.c
ar rc libmyobject.a o.o
cp libmyobject.a libmyobject.a.keep
ranlib libmyobject.a
Я попытался сравнить размер файла библиотеки до и после ranlib, я получил:
-rw-rw-r-- 1 a a 1626 Oct 3 12:03 libmyobject.a.keep
-rw-rw-r-- 1 a a 1626 Oct 3 12:06 libmyobject.a
Они одинакового размера. Это выходит за рамки моих ожиданий. Я ожидаю, что runlib сохранит некоторую дополнительную информацию в файле .a . Но на самом деле размер файла остается прежним.
Итак, какую работу на самом деле выполняет ranlib, как я могу проверить, какую работу выполнил ranlib? Спасибо.
Комментарии:
1. Почему вы ожидаете изменений в этом случае? Индекс будет одинаковым в обоих случаях — желателен детерминированный вывод команды (я полагаю, вы столкнулись
--enable-deterministic-archives
с параметром конфигурации binutils)
Ответ №1:
Если binutils компилируется с --enable-deterministic-archives
помощью, то по умолчанию несколько запусков ranlib на одних и тех же входных источниках будут выдавать один и тот же выходной файл, поскольку он обнуляет значения timestamp, uid и gid.
Вы можете сделать его недетерминированным, передав -U
флаг, что приведет к сохранению значений timestamp, uid и gid, а поскольку временная метка изменится, файлы будут другими:
$ ranlib -U libmyobject.a
$ diff libm*
Binary files libmyobject.a and libmyobject.a.keep differ
однако размер файла останется прежним.
$ ls -l libm*
-rw-r--r-- 1 xx xx 1618 Oct 3 13:58 libmyobject.a
-rw-r--r-- 1 xx xx 1618 Oct 3 13:58 libmyobject.a.keep
Имейте в виду, что детерминизм в подобных инструментах на самом деле весьма желателен, поскольку он позволяет таким функциям, как воспроизводимые сборки, работать без необходимости добавлять свертки в процесс сборки.
Ответ №2:
С помощью современных инструментов GNU я не знаю, возможно ли на самом деле создать архив, у которого нет индекса. ar
создает индекс по умолчанию, я не вижу возможности не создавать его, и я не вижу никакой команды для его удаления.
Запуск ranlib
архива после его создания — это то, что вы делаете, чтобы заставить процесс сборки работать на старых, более сложных системах UNIX.