2009-02-24 12 views
5

Kann ich beim Erstellen eines Projekts mit einem C++ - Compiler sicherstellen, dass die erstellte Binärdatei nicht betroffen ist, wenn der Quellcode nicht geändert wurde? Es sieht so aus, als ob jedes Mal, wenn ich meine Quelle neu kompiliere, die MD5-Prüfsumme der Binärdatei betroffen ist. Beeinflusst die Zeit der Kompilation irgendwie die produzierte Binärdatei? Wie kann ich wiederholbare Zusammenstellungsergebnisse erzeugen?Wiederholbare Objektcode-Generierung C++

+1

Vielleicht, was Sie brauchen, ist eine bessere Möglichkeit, Versionen neben MD5 die Binärdatei zu verfolgen? –

+0

Wozu brauchst du das? – jalf

Antwort

1

Verwenden Sie ein inkrementelles Buildsystem - wie make, um sicherzustellen, dass Sie Ihren Code nicht neu kompilieren, wenn sich die Quelle nicht ändert.

Es kann möglich sein, Ihre Kompilierung zu bekommen, um identische Binärdateien aus der gleichen Quelle zu machen - oder es kann nicht sein - es hängt vom Compiler ab. Die meisten werden die aktuelle Zeit irgendwo in die generierte Binärdatei einbetten.

+0

Inkrementelle Builds können zusätzliche Daten an Ihre Objektdateien anhängen, was zu Unterschieden führt. Stattdessen sollten Sie nicht inkrementelles Build verwenden, das jedes Mal neu erstellt wird. Überprüfen Sie diesen MS-Artikel: http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu

+0

@ tguclu Das ist eine andere Bedeutung von inkrementellen als meine. Nach meiner Definition macht ein inkrementelles Build-System für die Ausgabeobjekte keinen Unterschied: Sie werden nur neu erstellt, wenn sich ihre Quellen ändern. –

2

Ich vermute, dass es stark von Ihrer Toolchain und OS abhängen wird. Wenn beispielsweise einer der ausführbaren Header einen Zeitstempel enthält, werden Sie immer feststellen, dass das resultierende MD5 anders ist.

Was ist das Endergebnis, das Sie erreichen möchten (dh warum ist es so wichtig, dass sie identisch sind) ..?

+0

Ich suche Antworten hauptsächlich auf Visual Studio und Xcode/gcc. Wir bauen unser Produkt täglich neu auf. Ich würde gerne herausfinden, welche DLLs sich zwischen zwei Builds geändert haben. Kann ich dies tun, indem ich einige Flags im Compiler/Linker setze, um beim Erzeugen von Binärdateien keine Timestamp-Informationen zu verwenden? – user70336

+0

Nicht so weit ich weiß. – Sean

3

Man kann die Binärdateien zerlegen und md5 am Ausgang

Beispiel auf MacOSX

otool -tV a.out | md5 
ee2e724434a89fce96aa6b48621f7220 

Aber man verpasst die globalen Daten laufen ... (könnte ein Parameter enthalten sein)

ich bin auf das Problem der md5 Beantwortung einer binären Überprüfung ... wie Sie Ihre Quellen und Build-System zu verwalten als andere über auch eine Sache bei

zu suchen ist geschrieben
2

Sie können keinen MD5-Prüfsummenvergleich für Visual Studio durchführen. Für eine normale Release-Version .exe-Datei von Visual Studio gibt es drei Standorte, die sich mit jeder Neukompilierung ändern. 2 davon sind Zeitstempel und die dritte ist eine eindeutige GUID, die Visual Studio verwendet, um Versionen der .exe mit Hilfsdateien abzustimmen, um sicherzustellen, dass sie synchronisiert sind.

Es könnte möglich sein, ein Werkzeug zu schreiben, das die 3 sich ändernden Felder auf Null setzt, aber ich bin mir nicht sicher, wie einfach es wäre, die Datei zu parsen.

Auch, wenn Sie eine .dlls aufrufen, wenn ich mich recht erinnere, erhalten Sie mehr eindeutige Bezeichner in der generierten Datei.

Die Debug-Version ist eine andere Geschichte. Ich denke, es gibt viele, viele weitere Unterschiede.

Verwandte Themen