Vergleich der erzeugten ausführbaren Dateien, die für equivilance
Ich brauche zum vergleichen von 2 Dateien und/oder gemeinsame Objekte, kompiliert mit dem gleichen compiler/flags und stellen Sie sicher, dass Sie sich nicht geändert haben. Wir arbeiten in einem regulierten Umfeld, so wäre es wirklich nützlich für Testzwecke zu isolieren, genau das, was Teile der ausführbaren Datei geändert wurde.
Mit MD5Sums/- Hashes nicht funktioniert aufgrund der Header enthält Informationen über die Datei.
Kennt jemand ein Programm oder einen Weg, um zu überprüfen, dass die 2 Dateien sind executionally das gleiche, auch wenn Sie gebaut wurden, zu einem anderen Zeitpunkt?
- Wahrscheinlich hängt von der Plattform ab....
- Ok, es ist Linux kompiliert mit GCC.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine interessante Frage. Ich habe ein ähnliches problem unter linux. Intrusion-detection-Systeme wie OSSEC oder tripwire erzeugen false positives, wenn die hashsummen einer ausführbaren Datei ändert sich plötzlich. Dies kann nichts Schlimmeres, als die Linux "prelink" Programm patchen die ausführbare Datei für schnellere Start-UPS.
Vergleichen, um zwei binaries (in der ELF-format), kann man die "readelf" ausführbare Datei und dann "diff" vergleichen Ausgänge. Ich bin sicher, es gibt ausgereifte Lösungen, aber ohne weitere Umschweife, eines Armen Mannes Komparator in Perl:
Nun kann man zum Beispiel auf Maschine 1:
Und auf Maschine 2:
Nachdem copypasted, SFTP-ed-oder NSF-ed (die Sie nicht FTP verwenden, tun Sie?) die Dateien in den gleichen Dateibaum, vergleichen Sie die Dateien:
In meinem Fall bestehen Unterschiede im Abschnitt ".gnu.Konflikt", ".gnu.liblist", ".bekam.plt" und ".dynbss", das wäre ok für ein "prelink" intervention, sondern in den code-Abschnitt ".text", das wäre ein Schlechtes Zeichen.
Follow-up, hier ist was ich kam mit schließlich:
Stattdessen der Vergleich der endgültigen ausführbaren Dateien & shared objects), die wir verglichen die .o-Dateien-Ausgabe vor der Verlinkung. Wir nahmen an, dass die Verknüpfung von Prozess war ausreichend reproduzierbar, dass das wäre in Ordnung.
Funktioniert es in einigen unserer Fälle, wo wir zwei builds wurden wir habe eine kleine änderung sollte keinen Einfluss auf die endgültige code (pretty-printer), aber hilft uns nicht, wenn wir nicht die build-Vermittler ausgegeben.
Können Sie vergleichen die Inhalte von RO und RW initialisiert Abschnitte durch die Erstellung einer Binär-Datei, aus der ELF-Datei.
Verwenden Sie die generierte binäre Dateien zu vergleichen, wenn Sie identisch sind, mit
diff
zum Beispiel.Meiner Meinung nach, ist dies genug, um grantee Sie erzeugen die gleiche ausführbare Datei.
Ein paar Jahren hatte ich die gleiche Sache zu tun. Wir mussten beweisen, dass wir wiederaufbauen konnte die ausführbare Datei aus dem Quellcode, wenn nur eine revision-Nummer, revision-control-repository, build-tools und build-Konfiguration. Hinweis: Wenn alle diese ändern, sehen Sie möglicherweise einen Unterschied.
Ich erinnere mich, es ist einige timestamps in der ausführbaren Datei. Der trick ist, zu erkennen, dass die Datei nicht nur ein Haufen von bytes, das kann nicht interpretiert werden. Die Datei hat Abschnitte, die meisten werden sich nicht ändern, aber es wird ein Abschnitt für die Zeit des builds (oder so etwas).
Ich erinnere mich nicht alle details, aber die Befehle, die Sie benötigen, sind { objcopy, objdump, nm }, ich denke, objdump wäre der erste, um zu versuchen.
Hoffe, das hilft.