529 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?

15voto

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.)

10voto

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

Chris Jefferson Punkte 7272

Wie bereits erwähnt, sehen Sie sich die Flagge -S an.

Es lohnt sich auch, einen Blick auf die Familie der '-fdump-tree'-Flags zu werfen, insbesondere auf '-fdump-tree-all', mit dem Sie einige der Zwischenformen von gcc sehen können. Diese sind oft besser lesbar als Assembler (zumindest für mich) und zeigen Ihnen, wie die Optimierungsläufe ablaufen.

9voto

mcandre Punkte 20425

Wenn Sie auf der Suche nach LLVM-Assembly sind:

llvm-gcc -emit-llvm -S hello.c

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