2010-07-08 3 views
5

Windows의 소스 코드 바이너리에 대한 질문이 있습니다.동일한 간단한 소스 코드, Windows의 다른 바이너리

#include <stdio.h> 

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

    return 0; 
} 

동일한 소스 코드를 Windows (VS 2008 Cmmand Prompt : "CL")에서 두 번 컴파일했지만 다른 바이너리가 있습니다.

cl new.cpp 

왜 그런지, 어떻게 피할 수 있습니까?

+1

참조 빌드를 http://stackoverflow.com/questions/1221185/ same-build-on-different-systems 및 http://stackoverflow.com/questions/1277877/gcc-compiled-binaries-w-different-sizes - 기본적으로 컴파일러는 바이너리가 동일하다는 것을 보장하지 않습니다. –

+1

왜 바이너리가 동일해야합니까? – jalf

답변

4

타임 스탬프는 PE 형식의 일부입니다. 릴리즈로 컴파일할지 여부와 관계없이 항상 다른 값을 가져옵니다.

+0

어떻게 피할 수 있습니까? 타임 스탬프를 제거 할 수 있습니까? 리눅스에서 g ++/gcc를 사용하면 최종 바이너리가 동일하기 때문입니다. –

+2

@Peter : ELF (Linux의 실행 가능 형식)에는 타임 스탬프 필드가 없습니다. 출력이 다른 경우 왜 중요합니까? –

+0

@Billy : ELF에 타임 스탬프 필드가 없을 수도 있습니다. 동일한 소스 코드가 다른 바이너리를 작성하는 것은 매우 짜증나게됩니다. –

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

두 실행 파일에서 타임 스탬프를 같은 값으로 설정하여 문제를 해결할 수도 있습니다. –