Повторяемая генерация объектного кода C++

Когда я создаю проект с использованием компилятора C++, могу ли я убедиться, что на создаваемый бинарный файл не влияют изменения исходного кода? Похоже, что каждый раз, когда я перекомпилирую исходный код, это влияет на контрольную сумму двоичного файла md5. Влияет ли время компиляции на создаваемый бинарный файл? Как я могу получить результаты компиляции, которые можно повторить?

4 ответа

Можно разобрать двоичные файлы и запустить md5 на выходе

Пример на MacOSX

otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220

Но можно упустить глобальные данные...(может быть, параметр также включить)

Я отвечаю на проблему проверки бинарного файла md5... как вы управляете своими источниками и собираете систему, о чем писали другие, также стоит рассмотреть

Я подозреваю, что это будет сильно зависеть от вашего инструментария и ОС. Например, если один из исполняемых заголовков содержит временную метку, вы всегда обнаружите, что MD5 отличается.

Каков конечный результат, которого вы пытаетесь достичь (т.е. почему так важно, чтобы они были идентичными)?

Вы не можете сделать сравнение контрольной суммы md5 для visual studio. Для обычного выпуска версии.exe файла из Visual Studio будет 3 места, которые меняются при каждой перекомпиляции. 2 из них - метки времени, а третий - уникальный GUID, который Visual Studio использует для сопоставления версий.exe с файлами-помощниками, чтобы обеспечить их синхронизацию.

Возможно, можно написать инструмент, который обнулит 3 изменяющихся поля, но я не уверен, насколько просто будет проанализировать файл.

Кроме того, если вы вызываете какие-либо.dll, если я правильно помню, вы получите больше уникальных идентификаторов в сгенерированном файле.

Версия Debug - это отдельная история. Я думаю, что есть много различий.

Используйте систему инкрементной сборки - такую ​​как make чтобы вы не перекомпилировали свой код, если исходный код не изменился.

Может быть возможно заставить ваш компилятор создавать идентичные двоичные файлы из одного и того же источника - или нет - это зависит от компилятора. Большинство будет вставлять текущее время в сгенерированный двоичный файл где-то

Другие вопросы по тегам