Я работаю в строго регламентированной среде, в которой мы должны иметь возможность производить идентичные двоичные входные данные и предоставлять один и тот же исходный код каждый раз, когда создаются продукты. В настоящее время мы используем древнюю версию g ++, которая была исправлена, чтобы не записывать что-либо вроде даты / времени в результирующие двоичные файлы, которые будут меняться от сборки к сборке, но я бы хотел обновить до g ++ 4.7.2. Кто-нибудь знает о патче или есть предложения о том, что мне нужно искать, чтобы взять два одинаковых фрагмента исходного кода и произвести идентичные двоичные выходные данные?
Мы также зависим от бит-идентичных пересборок и используем gcc-4.7.x.
Помимо настройки PWD=/proc/self/cwd
и используя -frandom-seed=<input-file-name>
Есть несколько патчей, которые можно найти в svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7
ветка.
Debian Воспроизводимый строительный проект попытки стандартизировать пакеты Debian побайтово, и недавно получил Грант Linux Foundation.
Хотя это может включать в себя нечто большее, чем компиляция, вы должны взглянуть на это.
Это также указало мне на Эта статья, который добавляет следующие пункты к тому, что сказал @Employed:
/tmp/build
) иметь дело с __FILE__
__DATE__
, __TIME__
, __TIMESTAMP__
:
-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
: старые версии руководства говорят, что это источник недетерминизма, но уже нет. Не уверен, что это покрыто -frandom-seed
или нет.Buildroot имеет BR2_REPRODUCIBLE
вариант, который может дать некоторые идеи на уровне пакета, но это далеко не завершено на данный момент.
Связанные темы:
Использование ‘ДАТАмакрос делает сборку недетерминированной