2010-07-08 6 views
5

У меня есть вопрос о двоичном коде исходного кода в Windows.Тот же простой исходный код, разные двоичные файлы в Windows

#include <stdio.h> 

int main() 
{ 
    printf("Hello, world!\n"); 

    return 0; 
} 

Тот же самый исходный код, я составил дважды на Windows (VS 2008 Cmmand строки: "CL"), но у меня разные бинарные файлы.

cl new.cpp 

Можете ли вы, ребята, сказать мне, почему и как этого избежать?

+1

См http://stackoverflow.com/questions/1221185/ идентичные-build-on-different-systems и http://stackoverflow.com/questions/1277877/gcc-compiled-binaries-w-different-sizes - в принципе, никакие компиляторы не гарантируют, что двоичные файлы будут идентичными. – 2010-07-08 16:46:53

+1

Зачем вам нужно, чтобы двоичные файлы были идентичными? – jalf

ответ

4

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

+0

Как я могу избежать этого? Можно ли удалить временную метку? Потому что в Linux, если я использую g ++/gcc, окончательные двоичные файлы одинаковы. –

+2

@Peter: ELF (исполняемый формат Linux) не имеет поля timestamp. Почему имеет значение, отличается ли выход? –

+0

@Billy: Вы правы, что ELF может не иметь поля timestamp. Это очень раздражает тот же исходный код для разных двоичных файлов. –

1

Вы компилировались в качестве выпуска? Отладка имеет встроенные временные метки, которые могут изменить ваш exe на компиляцию

+0

Компиляция, как указано выше, дала разницу в 1 байт. LSB встроенной метки времени. – mocj

1

Я гугле и нашел Полпути решение:

DUMPBIN /RAWDATA MyApp.EXE > first.txt 
DUMPBIN /RAWDATA MyApp.EXE > second.txt 

http://support.microsoft.com/kb/164151 Как сравнить бинарных изображений одного и того же проекта строит

+0

Вы также можете обойти это, установив метку времени в одно и то же значение в обоих исполняемых файлах. –

Смежные вопросы