Как получить детерминированный двоичный вывод с помощью 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 вариант, который может дать некоторые идеи на уровне пакета, но на данный момент он далек от завершения.
обзоры темы: