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

обзоры темы:


использование 'дата ' макрос делает построение недетерминированным