501 votes

Comment obtenez-vous l'assembleur de sortie de source C/C++ avec gcc?

Comment fait-on cela?

Si je veux analyser comment quelque chose a été compilé, comment pourrais-je obtenir les émissions de code assembleur?

552voto

Andrew Edgecombe Points 13183

Utiliser l' -S option de gcc (ou g++).

gcc -S helloworld.c

Cela va lancer le préprocesseur (rpc) sur helloworld.c, effectuer la compilation initiale puis s'arrêter devant l'assembleur est exécuté.

Par défaut, cette valeur de sortie d'un fichier helloworld.s. Le fichier de sortie peut être définie à l'aide de l' -o option.

gcc -S -o my_asm_output.s helloworld.c

Bien sûr, cela ne fonctionne que si vous avez de la source d'origine. Une alternative si vous avez uniquement la résultante de l'objet fichier est d'utiliser objdump, par réglage de l' --disassemble (ou -d pour la forme abrégée).

objdump -S --disassemble helloworld > helloworld.dump

Cette option fonctionne mieux si le débogage est activée pour le fichier de l'objet (-g au moment de la compilation) et le fichier n'a pas été dépouillé.

L'exécution file helloworld va vous donner quelques indication sur le niveau de détail que vous obtiendrez en utilisant objdump.

203voto

PhirePhly Points 1343

Cela permettra de produire de l'asm avec le code C + les numéros de ligne tissées, de voir plus facilement ce que les lignes de générer ce code.

# create assembler code:
c++ -S -fverbose-asm -g -O2 test.cc -o test.s
# create asm interlaced with source lines:
as -alhnd test.s > test.lst

Trouvé dans les Algorithmes pour les programmeurs, page 4.

53voto

Cr McDonough Points 81

La ligne de commande suivante à partir de Christian Garbin blog

g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt

J'ai couru G++ à partir d'une fenêtre DOS sous Win-XP, contre une routine qui contient un cast implicite

c:\gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
horton_ex2_05.cpp: In function `int main()':
horton_ex2_05.cpp:92: warning: assignment to `int' from `double'

La sortie est asssembled code généré iterspersed avec l'original du code C++ (C++ code est indiqué que les commentaires de l'asm généré de flux)

  16:horton_ex2_05.cpp **** using std::setw;
  17:horton_ex2_05.cpp ****
  18:horton_ex2_05.cpp **** void disp_Time_Line (void);
  19:horton_ex2_05.cpp ****
  20:horton_ex2_05.cpp **** int main(void)
  21:horton_ex2_05.cpp **** {
 164                    %ebp
 165                            subl $128,%esp
?GAS LISTING C:\DOCUME~1\CRAIGM~1\LOCALS~1\Temp\ccx52rCc.s
166 0128 55                    call ___main
167 0129 89E5          .stabn 68,0,21,LM2-_main
168 012b 81EC8000      LM2:
168      0000
169 0131 E8000000      LBB2:
169      00
170                    .stabn 68,0,25,LM3-_main
171                    LM3:
172                            movl $0,-16(%ebp)

34voto

Doug T. Points 33360

Utilisez le commutateur-S

g++ -S main.cpp

ou aussi avec gcc

gcc -S main.c

Voir aussi cette

15voto

Dark Shikari Points 6178

Si ce que vous voulez voir dépend de la connexion de la sortie, puis objdump sur l'objet de sortie de fichier/exécutable peut également être utile dans le cadre de ladite gcc-S. Voici un très utile script par Loren Merritt qui convertit la valeur par défaut objdump syntaxe dans la plus lisible de msna de syntaxe:

#!/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;

Je crois que cela peut aussi être utilisée sur la sortie de gcc-S.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X