Я работаю в очень регулируемой среде, где мы должны иметь возможность создавать идентичные двоичные входные данные, чтобы каждый раз создавать исходные тексты. В настоящее время мы используем древнюю версию g++, которая была исправлена, чтобы не писать ничего, как дата/время в результирующих двоичных файлах, которые будут меняться от сборки к сборке, но я хотел бы обновить g++ 4.7.2. Кто-нибудь знает о патче или имеет предложения о том, что мне нужно искать, чтобы взять две идентичные части исходного кода и произвести идентичные двоичные выходы?
Как создать детерминированный двоичный вывод с g++?
Ответ 1
Мы также зависим от бит-идентичных перестроек и используем gcc-4.7.x.
Помимо установки PWD=/proc/self/cwd и использования -frandom-seed=<input-file-name>, имеется несколько патчей, которые можно найти в ветке svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7.
Ответ 2
Debian Reproducible строит проект, пытаясь стандартизировать пакеты Debian побайтово, и получил грант Linux Foundation в 2016 году.
Хотя это может включать в себя нечто большее, чем компиляция, вы должны взглянуть на это.
Он также указал мне на эту статью, которая добавляет следующие моменты к тому, что сказал @Employed:
- поместите исходный код в фиксированную папку (например,
/tmp/build) для работы с__FILE__ - для
__DATE__,__TIME__,__TIMESTAMP__:- libfaketime: https://github.com/wolfcw/libfaketime
- переопределить эти макросы с помощью
-D -
-Wdate-timeили-Werror=date-time: предупредить или дать сбой, если используются__TIME__,__DATE__или__TIMESTAMP__. Ядро Linux 4.4 использует его по умолчанию.
- используйте флаг
Dсarили используйте https://github.com/nh2/ar-timestamp-wiper/tree/master чтобы стереть штампы -
-fno-guess-branch-probability: более ранние версии руководства говорят, что это источник не -D, но уже не источник. Не уверен, что это покрыто-frandom-seedили нет.
У Buildroot есть опция BR2_REPRODUCIBLE которая может дать некоторые идеи на уровне пакета, но на данный момент она далека от завершения.
Связанные темы:
Ответ 3
Использование макроса " DATE " делает сборку недетерминированной