5

Esiste un modo per forzare lo stesso codice a produrre lo stesso binario in Visual C++? Disattivare il timestamp nel PE o forzare il timestamp nel PE per avere un valore fisso, in altre parole?Riproducibilità binaria in Visual C++

risposta

3

Suppongo che si possa scrivere un'utilità per aprire PE, impostare il checksum su 0, impostare il timestamp su ciò che si desidera, ricalcolare il crc, quindi riscriverlo. Sarebbe bello se ci fosse un modo ufficiale per garantire la perfetta riproducibilità binaria, però.

Per maggiori informazioni: http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

3

Non è solo un timestamp - c'è un GUID incorporato utilizzato per il progetto preliminare di bilancio di corrispondenza - come John Robbins explains.

Anche oltre a questo, non c'è proprio nessun modo per forzare il compilatore a generare risultati coerenti, come Jim Griesmer explains -

scrittori del compilatore sono molto più interessati a generare correttamente funzionante del codice e generare rapidamente rispetto garantire che tutto ciò che viene generato è disposto in modo identico sul tuo disco fisso. A causa dei numerosi e svariati metodi e implementazioni per l'ottimizzazione del codice, è sempre possibile che una build abbia finito con un po 'più di tempo per fare qualcosa di extra o diverso rispetto a un'altra build. Pertanto, il risultato finale potrebbe essere un diverso insieme di bit per la stessa funzionalità.

Pertanto, la funzione e l'ordine sezione sono non garantita costantemente ordini in risultante PE. Un esempio è al link.