Воспроизводимые сборки с помощью Visual Studio - разница в объектных файлах

Я пытаюсь сделать так, чтобы две разные машины производили одинаковые сборки. Я попытался сделать среду как можно более похожей, но все же вижу некоторые различия в сгенерированных файлах .obj и .exe. Мне удалось исключить встроенные различия в путях и временные метки. Я также убедился, что минимальные примеры кода (например, программа hello world фактически создают идентичные двоичные файлы).

В настоящее время некоторые объектные файлы похожи, а другие нет. Если я посмотрю на те, которые отличаются, используя разницу dumpbin /all, я вижу такие различия:

> COMDAT; sym= "public: static int const std::numeric_limits<long double>::max_exponent" (?max_exponent@?$numeric_limits@O@std@@2HB)

< COMDAT; sym= "public: static int const std::_Locbase<int>::collate" (?collate@?$_Locbase@H@std@@2HB)

во многих SECTION HEADER. Не доказав это на 100%, мне кажется, что каждое различие - это строка, которая встречается в другом разделе в выгруженном выводе из другого объектного файла. Кажется, что все в другом порядке. (Но учтите, что это только мое текущее предположение - я могу ошибаться.)

Есть какие-нибудь намеки на то, как двигаться дальше и в чем может быть причина? Порядок сборки / связывания?

Я также видел, что Microsoft пишет это:

ПРИМЕЧАНИЕ. Нет никакой гарантии, что Visual C ++ сгенерирует один и тот же двоичный образ при построении одних и тех же исходных файлов при последующих сборках. Однако вам гарантируется, что EXE (или DLL) будет вести себя точно так же при выполнении, при прочих равных условиях.

но мне все еще интересно, что происходит в моем конкретном случае. В моем случае последовательные сборки на одной машине обеспечивают идентичные сборки.


person Zitrax    schedule 15.12.2015    source источник
comment
Маловероятно, что когда-либо будут получены идентичные двоичные файлы с разных машин (или даже с одной). Если вы специально не укажете, какие части должны быть идентичными (и что вы собираетесь делать с этой информацией), на этот вопрос можно ответить только следующим образом: Невозможно.   -  person IInspectable    schedule 15.12.2015
comment
@IInspectable - Мне было бы достаточно доказать это для одной пары сборки - мне не нужны непрерывные двоичные совпадения. Но в целом ли эту проблему решить в Windows намного сложнее, чем в Linux? Ограничения в VS? Я видел несколько случаев, когда продвигалась работа над воспроизводимостью сборки в Linux - например, пакеты debian.   -  person Zitrax    schedule 15.12.2015
comment
Как вы уже цитировали, Visual Studio гарантирует идентичное поведение, и все. Вы до сих пор не объяснили, почему вам нужно знать, идентичны ли 2 двоичных файла (для некоторого определения идентичных). Не зная, зачем вам эта информация, трудно дать удовлетворительный ответ.   -  person IInspectable    schedule 15.12.2015
comment
@IInspectable - это требование безопасности (аналогично тому, что было сделано при аудите TrueCrypt). Если есть различия, я, по крайней мере, смогу выяснить, почему. И в случае, который я показал выше, у меня до сих пор нет удовлетворительного ответа. Для небольших программ мне удалось точно определить, что разница A связана с X, а разница B связана с Y.   -  person Zitrax    schedule 15.12.2015
comment
Пробовали ли вы шаги, рекомендованные в статье базы знаний, на которую вы ссылаетесь (в частности, использование DUMPBIN с переключателем / RAWDATA), даже если они, вероятно, применимы к компилятору, который вы не используете?   -  person IInspectable    schedule 15.12.2015
comment
@IInspectable да, это включено в переключатель / ALL, который я использовал, так что он в основном такой же, как то, что я опубликовал выше. Необработанное значение в этом случае говорит, что оно изменилось с 00040000 на 01000000, что мне мало что говорит.   -  person Zitrax    schedule 15.12.2015
comment
Хорошо, я не знал об этом. Если это не дает надежного решения, вы можете добиться большего успеха, сравнивая файлы .obj, а не окончательный двоичный образ.   -  person IInspectable    schedule 15.12.2015
comment
Сейчас я сравниваю объектные файлы, упомянутые в тексте вопроса.   -  person Zitrax    schedule 15.12.2015


Ответы (1)


Поэтому, хотя я не могу точно объяснить, почему двоичный файл выглядел так, как он, я обнаружил одно «неожиданное» отличие в среде, которое было основной причиной.

В журнале сборки упоминаются разные версии для rc.exe (компилятор ресурсов). Оказывается, это часть комплектов Windows Kits, которые поставляются с VS. Однако, если вы установите две версии Visual Studio, они будут совместно использовать rc, в то время как компилятор и компоновщик будут отдельными.

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

person Zitrax    schedule 15.12.2015