Как создать детерминированный двоичный вывод с g++?
Я работаю в очень регулируемой среде, где мы должны иметь возможность создавать идентичные двоичные входные данные, чтобы каждый раз создавать исходные тексты. В настоящее время мы используем древнюю версию g++, которая была исправлена, чтобы не писать ничего, как дата/время в результирующих двоичных файлах, которые будут меняться от сборки к сборке, но я хотел бы обновить g++ 4.7.2. Кто-нибудь знает о патче или имеет предложения о том, что мне нужно искать, чтобы взять две идентичные части исходного кода и произвести идентичные двоичные выходы?
Ответы
Ответ 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 " делает сборку недетерминированной