Как получить детерминированный двоичный вывод с помощью g++?
Я работаю в очень регулируемой среде, где нам нужно иметь возможность производить идентичный двоичный вход, каждый раз давать один и тот же исходный код. В настоящее время мы используем древнюю версию g++, которая была исправлена, чтобы не писать ничего вроде даты/времени в результирующих двоичных файлах, которые будут меняться от сборки к сборке, но я хотел бы обновить до g++ 4.7.2. Кто-нибудь знает о патче или имеет предложения о том, что мне нужно искать, чтобы взять две идентичные части источника код и производить идентичные двоичные выходы?
3 ответов
мы также зависим от бит-идентичных перестроений и используем 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 grant.
хотя это может включать в себя больше, чем компиляция, вы должны взглянуть на него.
он также указал мне на в этой статье, который добавляет следующие моменты к тому, что @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
: старые версии руководства скажем, это источник недетерминизма, но не больше. Не уверен, что это покрывается-frandom-seed
или нет.
Buildroot есть BR2_REPRODUCIBLE
вариант, который может дать некоторые идеи на уровне пакета, но на данный момент он далек от завершения.
обзоры темы: