Es gibt keinen universellen Weg, aber Sie können eine fundierte Vermutung anstellen, indem Sie nach Dingen suchen, die nur von einem Compiler ausgeführt werden.
GCC ist am einfachsten; Es schreibt einen .comment
Abschnitt, der die GCC-Versionszeichenfolge enthält (dieselbe Zeichenfolge, die Sie erhalten, wenn Sie ausführen gcc --version
). Ich weiß nicht, ob es eine Möglichkeit gibt, es anzuzeigen readelf
, aber objdump
damit:
objdump -s --section .comment /path/binary
Mir ist gerade klar geworden, dass ich den Rest Ihrer Frage ignoriert habe. Flags werden im Allgemeinen nirgendwo gespeichert. Sie wären höchstwahrscheinlich in einem Kommentarbereich, aber ich habe das noch nie gesehen. Es gibt einen Punkt in der COFF-Kopfzeile für einen Zeitstempel, aber es gibt keine Entsprechung in ELF, sodass ich auch nicht denke, dass die Kompilierungszeit verfügbar ist
objdump
? Gibt es weitere Informationen? Verfügbar auf verschiedenen Plattformen? Saubereres Ausgabeformat?Sie können versuchen, den
strings
Befehl zu verwenden. Es wird viel Text ausgegeben; Wenn Sie es überprüfen, können Sie den Compiler erraten.pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Hier weiß ich, dass es mit kompiliert wurde,
gcc
aber Sie können diestrings
Ausgabe immer in eine Datei umleiten und sie untersuchen.Es gibt ein sehr gutes Hilfsprogramm
peid
für Windows, aber ich kann keine Alternative für Linux finden.quelle
Es gibt zwei Methoden. Beide geben das gleiche Ergebnis
Wenn Sie den Befehl readelf verwenden,
readelf -S binary
werden die 40 Abschnittsüberschriften in der Binärdatei angezeigt. Notieren Sie die Seriennummer der.comment
Abschnittsüberschrift. In meinem System zeigte es als 27 (kann für Ihren Fall unterschiedlich sein)readelf -x 30 path/to/binary
-> welches den Hex-Dump des Abschnitts '.comment' anzeigt. In diesem Dump sehen Sie den Compiler, mit dem die Binärdatei erstellt wurde.quelle
readelf oder objdump können dies beide tun.
Die von gcc kompilierte ELF-Datei fügt die beiden Abschnitte .note.ABI-tag und .note.gnu.build-id hinzu. beide könnten angezeigt werden von
Option "s" bedeutet, dass der gesamte Inhalt angezeigt wird, "j" für die Angabe des Abschnittsnamens. Dieser Stil erhält den hexadezimalen Inhalt dieser Abschnitte.
zeigt den lesbaren Inhalt von ELFFILE einmal an. Option "n" bedeutet NOTES.
Wählen Sie eine wie Sie möchten.
Verwenden Sie übrigens objcopy und fügen Sie Ihren eigenen Abschnitt in die elf-Datei ein.
quelle
readelf -n
Arbeitete für mich - Beispiel Ausgabe:Displaying notes found in: .note.gnu.build-id Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: b88bae04e9043b71b329bac0ce2a2e5314183272
Sie können auch dieses clevere Skript verwenden , das die Anzahl der verschiedenen CPU-Anweisungen zählt, die von der Binärdatei verwendet werden. Es basiert auf der Analyse der Ausgabe von objdump. Beachten Sie, dass es ziemlich lange dauern kann, bis der Vorgang abgeschlossen ist, wenn Sie ihn auf einer großen Binärdatei verwenden.
quelle
Könnte einen Glücksschuss wert sein, je nachdem welches Programm. Einige Programme haben dies als Information kompiliert und können über einen Versionsaufruf (-V, --version, -Version usw.) darauf zugreifen. Möglicherweise finden Sie eine Untergruppe der gesuchten Elemente (einschließlich der Nullgruppe). Hier ist ein besonders fruchtbares Beispiel, Perl 5:
quelle
Wenn Sie eine ELF-Binärdatei in 7-zip öffnen, werden die verschiedenen Abschnitte darin aufgelistet. Von dort aus können Sie über die Kontextmenüoption "Ansicht" im Abschnitt ".comment" die Kommentare des Compilers anzeigen (z. B. "GCC: (GNU) 4.9 20150123 (Vorabversion) Android-Clang-Version 3.8.256229 (basierend auf LLVM 3.8.256229)).
Beachten Sie, dass der Abschnitt ".comment", falls vorhanden, mit einem Nullzeichen zu beginnen scheint. Wählen Sie daher eine Viewer-Anwendung für die Verwendung in 7-zip aus, die dadurch nicht verwirrt wird (z. B. versucht, das zu interpretieren) Daten als Unicode). Andere Abschnitte, die existieren und von Interesse sein können, sind ".note. *".
quelle