Ich habe mich gefragt, wie man GCC benutzt in meiner C-Quelldatei verwenden soll, um eine mnemonische Version des Maschinencodes zu sichern, damit ich sehen kann, in was mein Code kompiliert wird. Sie können dies mit Java tun, aber ich konnte mit GCC keinen Weg finden.
Ich versuche, eine C-Methode in Assembly neu zu schreiben, und zu sehen, wie GCC dies tut, wäre eine große Hilfe.
Antworten:
Wenn Sie mit Debug-Symbolen kompilieren, können Sie
objdump
eine besser lesbare Demontage erstellen.objdump -drwC -Mintel
ist nett:-r
Zeigt Symbolnamen bei Umzügen an (so wieputs
in der folgendencall
Anleitung dargestellt).-R
zeigt dynamisch verknüpfte Verschiebungen / Symbolnamen (nützlich für gemeinsam genutzte Bibliotheken)-C
entwirrt C ++ - Symbolnamen-w
ist der "breite" Modus: Die Maschinencode-Bytes werden nicht in Zeilenumbruch gebracht-Mintel
: Verwenden Sie GAS / binutils MASM-ähnliche.intel_syntax noprefix
Syntax anstelle von AT & T.-S
: Verschachteln Sie die Quellleitungen mit der Demontage.Sie könnten so etwas
alias disas="objdump -drwCS -Mintel"
in Ihre setzen~/.bashrc
Beispiel:
quelle
-Wa,-adhln -g to gcc
. Dies setzt voraus, dass der Assembler Gas ist, und dies ist möglicherweise nicht immer der Fall.-Mintel
.Wenn Sie GCC die Flagge geben
-fverbose-asm
, wird esquelle
objdump
-objdump -drwCS -Mintel
also wie kann ich so etwas wieverbose
mit verwendenobjdump
? Damit ich Kommentare in asm-Code haben kann, wie-fverbose-asm
in gcc?-fverbose-asm
hinzugefügt wird, besteht aus Kommentaren in der asm-Syntax der Ausgabe und nicht aus Anweisungen, die zusätzliche Elemente in die.o
Datei einfügen. Es wird alles zum Zeitpunkt der Montage verworfen. Sehen Sie sich die asm-Ausgabe des Compilers an, anstatt sie zu zerlegen, z. B. auf godbolt.org, wo Sie sie einfach mit der Maus über die Mauszeile und die farbliche Hervorhebung der entsprechenden Quell- / asm-Zeilen abgleichen können. Wie entferne ich "Rauschen" von der Ausgabe der GCC / Clang-Baugruppe?Direkt von http://www.delorie.com/djgpp/v2faq/faq8_20.html gerippt (aber fehlerhaft entfernt
-c
)quelle
gcc -march=native -O3 -save-temps
. Sie können weiterhin die-c
Erstellung von Objektdateien beenden, ohne zu versuchen, eine Verknüpfung herzustellen, oder was auch immer.-save-temps
ist interessant, da es auf einmal den exakten Code generiert, der generiert wird, während die andere Option, den Compiler aufzurufen, das-S
zweimalige Kompilieren und möglicherweise mit verschiedenen Optionen bedeutet. Aber-save-temps
Dumps alle im aktuellen Verzeichnis, was irgendwie chaotisch ist. Es sieht so aus, als wäre es eher als Debug-Option für GCC gedacht als als ein Tool zur Überprüfung Ihres Codes.Die Verwendung des
-S
Wechsels zu GCC auf x86-basierten Systemen erzeugt standardmäßig einen Speicherauszug der AT & T-Syntax, der mit dem-masm=att
Schalter wie folgt angegeben werden kann:Wenn Sie dagegen einen Speicherauszug in Intel-Syntax erstellen möchten, können Sie den
-masm=intel
Schalter folgendermaßen verwenden:(Beide erzeugen Dumps von
code.c
in ihre verschiedenen Syntax, jeweils in die Dateicode.s
)Um ähnliche Effekte mit objdump zu erzielen, sollten Sie den Schalter
--disassembler-options=
intel
/att
switch verwenden, ein Beispiel (mit Code-Dumps, um die Unterschiede in der Syntax zu veranschaulichen):und
quelle
gcc -S -masm=intel test.c
bei mir nicht genau funktioniert hat, ich habe eine Kreuzung aus Intel- und AT & T-Syntax wie folgt:mov %rax, QWORD PTR -24[%rbp]
statt dieser :movq -24(%rbp), %rax
..o
und ASM-Dateien durchgeführt wird, dh via-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
Option verwenden, es ist das gleiche wie--disassembler-options
aber viel kürzer, zBobjdump -d -M intel a.out | less -N
godbolt ist ein sehr nützliches Tool. Die Liste enthält nur C ++ - Compiler. Sie können jedoch das
-x c
Flag verwenden, um den Code als C zu behandeln. Anschließend wird nebeneinander eine Assembly-Liste für Ihren Code erstellt, und Sie können dieColourise
Option zum Generieren verwenden Farbige Balken zeigen visuell an, welcher Quellcode der generierten Assembly zugeordnet ist. Zum Beispiel der folgende Code:Verwenden Sie die folgende Befehlszeile:
und
Colourise
würde Folgendes erzeugen:quelle
-masm=intel
aber was ist mit dem Rest?-x c
Haben Sie
gcc -S -fverbose-asm -O source.c
dann versucht , in die generiertesource.s
Assembler-Datei zu schauen ?Der generierte Assembler-Code geht in
source.s
(Sie können diesen mit-o
Assembler-Dateinamen überschreiben ); Die-fverbose-asm
Option fordert den Compiler auf, einige Assembler-Kommentare auszugeben, die den generierten Assembler-Code "erklären". Die-O
Option fordert den Compiler auf, ein wenig zu optimieren (es könnte mit-O2
oder mehr optimieren-O3
).Wenn Sie verstehen möchten, was
gcc
passiert-fdump-tree-all
, versuchen Sie es, aber seien Sie vorsichtig: Sie erhalten Hunderte von Dump-Dateien.Übrigens ist GCC durch Plugins oder mit MELT (einer domänenspezifischen Hochsprache zur Erweiterung von GCC, die ich 2017 aufgegeben habe) erweiterbar.
quelle
source.s
, da viele Leute einen Ausdruck auf der Konsole erwarten würden.-S -o-
Dumps zu stdout.-masm=intel
ist hilfreich, wenn Sie die NASM / YASM-Syntax verwenden möchten. (aber es wirdqword ptr [mem]
nicht nur verwendet , sondernqword
ähnelt eher Intel / MASM als NASM / YASM). gcc.godbolt.org macht einen guten Job beim Aufräumen des Speicherauszugs : Optional werden nur Kommentarzeilen, nicht verwendete Beschriftungen und Assembler-Anweisungen entfernt.-Og
ist dies sogar noch besser als-O1
. Es bedeutet "Optimieren für das Debuggen" und macht asm ohne zu viele knifflige / schwer zu verfolgende Optimierungen, die alles tun, was die Quelle sagt. Es ist seit gcc4.8 verfügbar, aber Clang 3.7 hat es immer noch nicht. IDK, ob sie sich dagegen entschieden haben oder was.Sie können dafür gdb wie objdump verwenden.
Dieser Auszug stammt aus http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Hier ist ein Beispiel für eine gemischte Quelle + Assembly für Intel x86:
quelle
set disassembly-flavor intel
Befehl , um den Disassembler von GDB auf Intel-Syntax umzustellen .Verwenden Sie den Schalter -S (Hinweis: Großbuchstabe S) zu GCC, und der Assemblycode wird an eine Datei mit der Erweiterung .s ausgegeben. Zum Beispiel der folgende Befehl:
gcc -O2 -S -c foo.c
quelle
Ich habe gcc keinen Versuch gegeben, aber im Fall von g ++. Der folgende Befehl funktioniert für mich. -g für Debug-Build und -Wa, -adhln wird an Assembler zur Auflistung mit Quellcode übergeben
g ++ -g -Wa, -adhln src.cpp
quelle
Verwenden Sie -Wa, -adhln als Option für gcc oder g ++, um eine Listenausgabe an stdout zu erstellen.
-Wa, ... steht für Befehlszeilenoptionen für den Assembler-Teil (nach der C / ++ - Kompilierung in gcc / g ++ ausführen). Es wird als intern aufgerufen (as.exe in Windows). Sehen
> als --help
als Befehlszeile, um weitere Hilfe für das Assembler-Tool in gcc anzuzeigen
quelle