7
votes

Comment puis-je obtenir une sortie d'assembleur complète dans GCC?

Je sais que je peux obtenir l'assembleur code source généré par le compilateur à l'aide de: xxx

même si cela ne me donne pas de fichier objet une partie du processus.

Mais comment puis-je tout obtenir sur le code compilé? Je veux dire des adresses, les octets générés et ainsi de suite.

Les instructions de sortie par GCC -S -S ne me disent rien des longueurs d'instruction ou de codages, ce que je veux voir .


5 Réponses :


1
votes

Cela me semble comme si vous voulez un désassembleur. objdump est à peu près le standard ( otool sur Mac OS X); En concert avec toutes les informations de fichier de carte que votre linker vous donne, le démontage de votre fichier d'objet devrait vous donner tout ce que vous voulez.


0 commentaires

1
votes

GCC produira un fichier source de langage de montage. Vous pouvez ensuite utiliser tel que -a votrefile.s pour produire une liste comprenant des compensations et des octets codés pour chaque instruction. -A a également quelques sous-options pour contrôler ce qui s'affiche dans le fichier de liste ( comme --Help donnera une liste d'entre eux avec les autres options disponibles).


0 commentaires

0
votes
nasm -f elf xx.asm -l x.lst

gcc xx.c xx.o -o xx
generates a 'list' file x.lst which is only for xx.asmfor xx.c along with xx.asm you can compile them both and then use 'gdb' - gnu debugger

0 commentaires

11
votes

J'aime objdump pour cela, mais les options les plus utiles sont non évidentes - surtout si vous l'utilisez sur un fichier d'objet contenant des déménagements, plutôt qu'un binaire final.

objdump -d quelque_binary fait un travail raisonnable.

objdump -d quelque_Object.o est moins utile car les appels vers des fonctions externes ne sont pas démontés utiles. : xxx

l'appel est en réalité sur printf () ... Ajout du -r le drapeau aide à cela; Il marque les relocalisations. objdump -dr quelque_Object.o donne: xxx

alors, je trouve utile de voir chaque ligne annotée sous forme . Objdump a une option pratique pour cela, mais il a l'effet secondaire ennuyeux de désactiver la vidage des octets réels - objdump --prefix-adresses -DR quelque_Object.o donne: xxx

mais il s'avère que vous pouvez annuler cela en fournissant l'option une autre obscure, arrivant enfin à mon préféré objdump Incantation:

Objdump --Prefix-Adresses --Show-raw-insn -dr file.o

qui donne une sortie comme ceci: < / p> xxx

et si vous avez construit avec des symboles de débogage (c.-à-d. compilé avec -g ), et vous remplacez le -dr Avec -srl , il tentera d'annoter la sortie avec les lignes source correspondantes.


0 commentaires

3
votes

Le moyen le plus simple d'obtenir une liste rapide consiste à utiliser l'option -A sur l'assembleur, que vous pouvez effectuer en mettant -wa, -a sur le < Code> GCC ligne de commande. Vous pouvez utiliser divers modificateurs vers la option pour affecter exactement ce qui sort - voir la page AS (1) Man.


0 commentaires