Детерминированный Build C ++ Visual Studio 2015 [дубликат]

Это затронет только небольшую часть пользователей, но я бы хотел, чтобы это было документировано для этой небольшой части. Из-за этой проблемы этот член этой маленькой горстки потратил 6 часов на устранение неполадок с работающим PHP-почтовым скриптом.

Если вы собираетесь в университет, в котором работает XAMPP с сайта www.AceITLab.com, вы должны знать, что наш профессор не сказал нам: брандмауэр AceITLab (а не брандмауэр Windows) блокирует MercuryMail в XAMPP , Вам придется использовать альтернативный почтовый клиент, груша работает на нас. Вам нужно будет отправить учетную запись Gmail с низкими настройками безопасности.

Да, я знаю, это абсолютно бесполезно для электронной почты реального мира. Однако, из того, что я видел, академические настройки и реальный мир часто имеют очень мало общего.

26
задан Eugene 20 April 2016 в 19:53
поделиться

4 ответа

Я решил это до некоторой степени.

В настоящее время у нас есть система сборки, которая гарантирует, что все новые сборки находятся на пути постоянной длины (builds / 001, builds / 002 и т. д.), что позволяет избежать сдвигов в макете PE. После сборки инструмент сравнивает старые и новые двоичные файлы, игнорируя соответствующие поля PE и другие местоположения с известными поверхностными изменениями. Он также выполняет некоторые простые эвристики для обнаружения динамических игнорируемых изменений. Вот полный список вещей, которые следует игнорировать:

  • Временная метка PE и контрольная сумма
  • Запись каталога цифровой подписи
  • Экспортировать временную метку таблицы
  • Timestamp раздела отладчика
  • подпись, возраст и путь к файлу PDB
  • Временная метка ресурсов
  • Все версии файлов / продуктов в ресурсе VS_VERSION_INFO
  • Цифровые секция подписи
  • Запуск для заметок MIDL для встроенных библиотек типов (содержит строку timestamp)
  • __ FILE__, __DATE__ и __TIME__ макросы, когда они используются в качестве литералов (может быть широким или узким символом)

. Через какое-то время компоновщик сделает некоторые разделы PE более крупными, не выбрасывая что-нибудь еще из выравнивания. Похоже, что он перемещает границу раздела внутри прокладки - это все равно нули, но из-за этого я получаю двоичные файлы с 1 байтовой разницей.

UPDATE: мы недавно открыли инструмент на GitHub . См. Раздел «Сравнение» в документации.

9
ответ дан Eugene 21 August 2018 в 17:58
поделиться
  • 1
    Вот простой способ обхода временной метки TLB (проверен только на msvs_2015 + версия MIDL 7.00.0555): peparser_with_tlb – Smalti 29 June 2017 в 10:22

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

У вас есть два способа сделать this:

  1. Используйте команду subst.exe и сопоставьте букву диска с папкой сборки (это может быть ненадежным).
  2. Если файл subst.exe не работает , затем создайте ресурсы для каждой из ваших папок сборки и используйте команду «net use».

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

3
ответ дан hythlodayr 21 August 2018 в 17:58
поделиться
  • 1
    Я бы предложил то же самое, но используя символические ссылки под общим каталогом, например C: \ BUILD \ XXX – Preet Sangha 25 July 2009 в 02:45
  • 2
    Preet, как вы создаете символическую ссылку в Windows? – Rob Kennedy 25 July 2009 в 02:50
  • 3
    NTFS поддерживает точки соединения. Но вам нужно загрузить утилиту или быть на Vista +. Windows технически обрабатывает точки соединения по-разному, так как subst.exe может работать или не работать. – hythlodayr 25 July 2009 в 03:16
  • 4
    Коммутаторы будут работать, за исключением требования того же пути, указывающего на другое место для двух процессов, выполняющихся одновременно. Думаю, они упростили бы очистку ... – Eugene 25 July 2009 в 04:18
  • 5
    В то же время я не видел твой & quot; Требование спрятано в конце. Почему бы не упростить вопросы, строя последовательно? – hythlodayr 25 July 2009 в 04:41

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

2
ответ дан Ori Pessach 21 August 2018 в 17:58
поделиться
  • 1
    Не пытался, нет. Даже если он работает, он действительно не может быть надежно автоматизирован ... Хотя это может принести некоторый свет в то, что точно отличается. Я попробую, спасибо. – Eugene 25 July 2009 в 02:18
  • 2
    Я уверен, что вы можете автоматизировать разборку программного обеспечения. Выполнить из командной строки ... Это может быть хорошее решение в зависимости от того, какие змеи вы нажимаете на выход дизассемблера;) – Kieveli 25 July 2009 в 02:42

Стандартизировать пути сборки

Простым решением будет стандартизация ваших путей сборки, поэтому они всегда имеют форму, например:

c:\buildXXXX

Затем, когда вы сравните, скажем, build0434 с build0398, просто препроцессор двоичный, чтобы изменить все вхождения build0434 в build0398. Выберите шаблон, который, как вы знаете, вряд ли появится в вашем фактическом источнике / данных, за исключением тех строк, которые компилятор / компоновщик встраивается в PE.

Тогда вы можете просто провести свой обычный анализ разницы. Используя одинаковые пути, вы не будете перемещать какие-либо данные и вызывать ложные срабатывания.

Утилита Dumpbin

Еще один совет - использовать dumpbin.exe (поставляется с MSVC). Используйте dumpbin / all , чтобы сбрасывать все детали двоичного файла в текстовый / шестнадцатеричный дамп. Это может сделать более очевидным, чтобы увидеть, что / где меняется.

Например:

dumpbin /all program1.exe > program1.txt
dumpbin /all program2.exe > program2.txt
windiff program1.txt program2.txt

Или используйте свой любимый инструмент для обработки текста вместо Windiff.

Утилита Bindiff

Вы можете найти инструмент bindiff.exe от Microsoft, который можно получить здесь:

Инструменты поддержки Windows XP с пакетом обновления 2 (SP2)

Он имеет опцию / v, чтобы указать ему игнорировать определенные двоичные поля, такие как метки времени, контрольные суммы и т. д .:

«BinDiff использует специальную процедуру сравнения для Win32 исполняемые файлы, которые маскируют различные метки времени сборки в обоих файлах при выполнении сравнения. Это позволяет отмечать два исполняемых файла как «Near Identical», когда файлы действительно идентичны, за исключением того времени, когда они были созданы ».

Однако, похоже, что вы уже делаете надмножество того, что делает bindiff.exe.

8
ответ дан Slacker 21 August 2018 в 17:58
поделиться
  • 1
    К сожалению, исходный путь не поддерживается в виде обычного текста, и я не мог найти никакой информации о том, что на самом деле влияет на него, и если я могу смело игнорировать его. (ложные негативы в любом случае намного хуже, чем положительные). – Eugene 25 July 2009 в 02:29
Другие вопросы по тегам:

Похожие вопросы: