Библиотека `ar` заменяет метку времени

заголовок формата архива .a требует отметки времени. Это привело к бесчисленным головным болям, когда я перестраиваю статическую библиотеку, главным образом потому, что я не могу точно воспроизвести исходный двоичный файл.

Например ( это на моем Mac, но то же самое происходит в x64 linux):

$ cat foo.h
int foo();
$ cat foo.c
#include "foo.h"
int foo() { return 3; }
$ gcc -fno-pic -m64 -arch x86_64 -I/usr/local/include -O3 -c foo.c -o foo.o -fpic
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 0d0e6606185de4e994c47f4a0e54c1c4
$ mv libfoo.a libfoo.a1
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 22a69d42e1325ae8f978c2a18a4886da    

Чтобы доказать себе, что единственной разницей было время, я взял diff на основе hexdump:

$ diff <(hexdump libfoo.a) <(hexdump libfoo.a1)
2,3c2,3
< 0000010 20 20 20 20 20 20 20 20 31 33 31 31 30 34 33 30
< 0000020 38 36 20 20 35 30 31 20 20 20 32 30 20 20 20 20
---
> 0000010 20 20 20 20 20 20 20 20 31 33 31 31 30 34 32 38
> 0000020 37 31 20 20 35 30 31 20 20 20 32 30 20 20 20 20

который, если вы решите обратно, используя формат заголовка , соответствует полю времени.

На странице руководства не указано, можно ли переопределить метку времени из заголовка. Есть какие-нибудь мысли?

Редактировать: да, можно вернуться и физически взломать файл использовать произвольную метку времени. Да, можно изменить поведение программы. Учитывая обстоятельства ситуации, не все из которых являются строго техническими по своей природе, инструмент для изменения метки времени вручную неприемлем, равно как и модифицированная версия ar , и при этом не вмешивается в фактическое системное время.

Edit: в этом случае я должен доказать, что без каких-либо неприемлемых отклонений от пути сборки двоичные файлы могут быть созданы из исходного кода. В некоторых отраслях (например, в финансах) это, очевидно, стандартная практика. Инструмент с ручным управлением для изменения временных меток недопустим (потому что использовался специальный инструмент, которого не было в исходном пути сборки). Обработанная версия ar неприемлема (аналогичная проблема). Проблема с изменением системных часов заключается в том, что сборка должна быть идеально скоординирована (это часовая сборка с большим количеством библиотек и двоичных файлов). Приемлемые решения включают:

  • флаги для AR или других программ, которые могут переопределить метку времени в библиотеке
  • существующий (возраст> 1 год) инструмент для этого
  • флаги GCC, которые могут переопределить метку времени, исходящую от ar при связывании
9
задан Foo Bah 25 July 2011 в 07:20
поделиться