linux: ranlib, похоже, не добавляет никакой новой информации в архивный файл?

#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.