oryx_and_crake: (Default)
oryx_and_crake ([personal profile] oryx_and_crake) wrote2005-12-01 11:05 pm

Спасите, помогите, умираю (сравнение бинарных файлов с игнорированием timestamps)

Задача - сравнить два .ехе-файла, скомпилированные с одного проекта с одинаковыми настройками (все вообще одинаковое), но с некоторым промежутком времени, и, возможно, на разных машинах. Гадость заключается в том, что .exe-файлы при этом получаются чуточку разные. Подлая Вижуал Студия 2003 суёт туда timestamps где ни попадя и еще в одном месте прибавляет единичку с каждой последующей компиляцией проекта. Т.е. файлы получаются формально разными, хотя на самом деле они эквивалентны. Таймстемпы я кой-как победю, а вот с этим автоматическим прибавлением единицы я никак справиться не могу. По совету MSDN поставила статический номер версии в свойствах проекта - не помогает. Спасите. Буду немеряно благодарна. Хотя бы скажите, что это за переменная и как ее достать из формата PE/COFF.

P.S. В Гугль не посылать, windiff, bindiff, comp и dumpbin /rawdata с последующим fc /b не предлагать - пробовали, хуже.
P.P.S. Философский вопрос "на кой черт это надо, если файл изменился, то он и так изменился" прошу оставить за кадром. Это надо для дела.

(кросспост всюду, куда только можно)

UPDATE кому интересно: эта автоматически прибавляемая единица относится к переменной под названием Age, которая является составной частью Debug Directory в формате Codeview RSDS. Она имеет приблизительно следующую структуру:

CodeView format: RSDS

Signature: {d0b024a8-5829-424e-b997-66cc1626a1c2} Age: 1

PdbFile: d:\depot\bas\640_rel\fes_640_REL\src\opt\NTintel\GridView.pdb

впрочем, это уже не имеет никакого значения.

[identity profile] zayeb.livejournal.com 2005-12-02 05:10 am (UTC)(link)
что значит сравнить? убедиться, что кроме таймстемпов и этой единички все остальное одинаково?
тогда пишем некий не особо хитрый код (потребуется проход вперед и откат на несколько байцтов назад с последующим возвращением вперед в местах несовпадения), который проходит по фалам по байтно и выписывает в 2 лога несовпавшие байты (и их адреса). Далее анализируются полученные логи. Да, это геморрой, я знаю :)

[identity profile] zayeb.livejournal.com 2005-12-02 05:23 am (UTC)(link)
сколько раз этот номер версии встречается?
он состоит из одного байта?
с большой долей вероятности если все совпадает, кроме различий в этом номере (да еще и его адрес в файлах совпадает) то это уж никак не минус или плюс