Comment fait-on cela?
Si je veux analyser comment quelque chose a été compilé, comment pourrais-je obtenir les émissions de code assembleur?
Comment fait-on cela?
Si je veux analyser comment quelque chose a été compilé, comment pourrais-je obtenir les émissions de code assembleur?
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.
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.
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)
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 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.