542 Stimmen

Wie erhalten Sie Assembler-Ausgabe von C/C++-Quellcode in gcc?

Wie kann man das tun?

Wenn ich analysieren möchte, wie etwas kompiliert wird, wie erhalte ich dann den emittierten Assemblercode?

16voto

Dark Shikari Punkte 7811

Wenn das, was Sie sehen wollen, von der Verknüpfung der Ausgabe abhängt, dann kann objdump auf der Ausgabeobjektdatei/dem ausführbaren Programm zusätzlich zu dem oben erwähnten gcc -S nützlich sein. Hier ist ein sehr nützliches Skript von Loren Merritt, das die standardmäßige objdump-Syntax in die besser lesbare nasm-Syntax umwandelt:

#!/usr/bin/perl -w
$ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR ';
$reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])';
open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die;
$prev = "";
while(<FH>){
    if(/$ptr/o) {
        s/$ptr(\[[^\[\]]+\],$reg)/$2/o or
        s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or
        s/$ptr/lc $1/oe;
    }
    if($prev =~ /\t(repz )?ret / and
       $_ =~ /\tnop |\txchg *ax,ax$/) {
       # drop this line
    } else {
       print $prev;
       $prev = $_;
    }
}
print $prev;
close FH;

Ich vermute, dass dies auch für die Ausgabe von gcc -S verwendet werden kann.

13voto

METADATA Punkte 111

Nun, wie jeder sagte, verwenden Sie die Option -S. Wenn Sie die Option -save-temps verwenden, können Sie auch eine vorverarbeitete Datei erhalten ( .i), Baugruppen-Datei( .s) und Objektdatei(*.o). (Sie erhalten sie jeweils durch Verwendung von -E, -S und -c.)

11voto

Dan Lenski Punkte 72055

Wie bereits erwähnt, sollten Sie die -S Option für den GCC. Ich möchte auch hinzufügen, dass die Ergebnisse (stark!) variieren können, je nachdem, ob Sie Optimierungsoptionen hinzufügen oder nicht ( -O0 für keine, -O2 für agressive Optimierung).

Insbesondere auf RISC-Architekturen wird der Compiler den Code bei der Optimierung oft bis zur Unkenntlichkeit verändern. Es ist beeindruckend und faszinierend, sich die Ergebnisse anzusehen!

9voto

Paige Ruten Punkte 164391

Verwenden Sie die Option -S:

gcc -S program.c

9voto

Antonin GAVREL Punkte 7751

Ich sehe diese Möglichkeit nicht unter den Antworten, wahrscheinlich weil die Frage aus dem Jahr 2008 stammt, aber im Jahr 2018 können Sie die Online-Website von Matt Goldbolt nutzen https://godbolt.org

Sie können sein Projekt auch lokal mit git klonen und ausführen https://github.com/mattgodbolt/compiler-explorer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X