2010-07-08 14 views
5

Ho una domanda sul codice sorgente binario su Windows.Stesso semplice codice sorgente, diversi file binari su Windows

#include <stdio.h> 

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

    return 0; 
} 

lo stesso codice sorgente, ho compilato due volte su Windows (VS 2008 Cmmand Prompt: "CL"), ma ho avuto diversi binari.

cl new.cpp 

Potete dirmi perché e come evitarlo?

+1

Vedi http://stackoverflow.com/questions/1221185/ identici-build-on-diversi-sistemi e http://stackoverflow.com/questions/1277877/gcc-compiled-binaries-w-different-sizes - in pratica nessun binario del compilatore garantisce che i binari saranno identici. –

+1

Perché i binari sono necessari per essere identici? – jalf

risposta

4

Il timestamp fa parte del formato PE. Otterrai sempre valori diversi a prescindere dalla compilazione come versione o meno.

+0

Come posso evitarlo? È possibile rimuovere il timestamp? Perché in Linux, se uso g ++/gcc, i binari finali sono gli stessi. –

+2

@Peter: ELF (il formato eseguibile di Linux) non ha un campo data/ora. Perché è importante se l'output è diverso? –

+0

@Billy: hai ragione che ELF potrebbe non avere il campo timestamp. È solo molto fastidioso che gli stessi binari del codice sorgente siano diversi. –

1

Hai compilato come versione? Il debug ha i timestamp incorporati in cui puoi cambiare il tuo exe per compilare

+0

La compilazione come indicato sopra ha prodotto una differenza di esattamente 1 byte. L'LSB del timestamp incorporato. – mocj

1

Ho cercato su google, e hanno trovato una soluzione a metà strada:

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

http://support.microsoft.com/kb/164151 Come confrontare le immagini binarie dello stesso progetto si basa

+0

È anche possibile aggirare il problema impostando il timestamp sullo stesso valore in entrambi i file eseguibili. –

Problemi correlati