Подтвердить что ты не робот

Как создать детерминированный двоичный вывод с g++?

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

4b9b3361

Ответ 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 " делает сборку недетерминированной