Je me demandais comment utiliser GCC sur mon fichier source C pour vider une version mnémonique du code machine afin que je puisse voir dans quoi mon code était compilé. Vous pouvez le faire avec Java mais je n'ai pas réussi à trouver un moyen avec GCC.
J'essaie de réécrire une méthode C dans l'assemblage et voir comment GCC le fait serait d'une grande aide.
Réponses:
Si vous compilez avec des symboles de débogage, vous pouvez utiliser
objdump
pour produire un désassemblage plus lisible.objdump -drwC -Mintel
est sympa:-r
affiche les noms des symboles lors des délocalisations (comme vous pouvez le voirputs
dans lescall
instructions ci-dessous)-R
affiche les relocalisations de liens dynamiques / noms de symboles (utile sur les bibliothèques partagées)-C
démêle les noms des symboles C ++-w
est un mode "large": il n'encapsule pas les octets de code machine-Mintel
: utilisez GAS / binutils comme une.intel_syntax noprefix
syntaxe MASM au lieu d'AT & T-S
: entrelacer les lignes source avec démontage.Vous pourriez mettre quelque chose comme
alias disas="objdump -drwCS -Mintel"
dans votre~/.bashrc
Exemple:
la source
-Wa,-adhln -g to gcc
. Cela suppose que l'assembleur est du gaz et ce n'est pas toujours le cas.-Mintel
.Si vous donnez le drapeau à GCC
-fverbose-asm
, illa source
objdump
-objdump -drwCS -Mintel
, alors comment puis-je utiliser quelque chose commeverbose
avecobjdump
? Pour que je puisse avoir des commentaires dans le code asm, comme-fverbose-asm
dans gcc?-fverbose-asm
sont sous la forme de commentaires dans la syntaxe asm de la sortie, et non de directives qui mettront quelque chose de plus dans le.o
fichier. Tout est jeté au moment de l'assemblage. Regardez la sortie asm du compilateur au lieu du démontage, par exemple sur godbolt.org où vous pouvez facilement la faire correspondre avec la ligne source via le survol de la souris et la coloration des lignes source / asm correspondantes. Comment supprimer le "bruit" de la sortie de l'assemblage GCC / clang?Extrait directement de http://www.delorie.com/djgpp/v2faq/faq8_20.html (mais en supprimant les erreurs
-c
)la source
gcc -march=native -O3 -save-temps
. Vous pouvez toujours utiliser-c
pour vous arrêter à la création d'un fichier objet sans essayer de lier, ou quoi que ce soit.-save-temps
est intéressant car il décharge en une seule fois le code généré par le code exact, tandis que l'autre option d'appeler le compilateur-S
signifie la compilation deux fois, et éventuellement avec des options différentes. Mais-save-temps
vide tout dans le répertoire courant, ce qui est un peu compliqué. On dirait qu'il est plus destiné à être une option de débogage pour GCC plutôt qu'un outil pour inspecter votre code.L'utilisation du
-S
commutateur vers GCC sur les systèmes x86 produit un vidage de la syntaxe AT&T, par défaut, qui peut être spécifié avec le-masm=att
commutateur, comme ceci:Alors que si vous souhaitez produire un vidage dans la syntaxe Intel, vous pouvez utiliser le
-masm=intel
commutateur, comme ceci:(Les deux produisent des vidages de
code.c
dans leurs différentes syntaxes,code.s
respectivement dans le fichier )Afin de produire des effets similaires avec objdump, vous voudriez utiliser le commutateur
--disassembler-options=
intel
/att
, un exemple (avec des vidages de code pour illustrer les différences de syntaxe):et
la source
gcc -S -masm=intel test.c
n'a pas exactement le travail pour moi, je suis un peu crossbreed d'Intel et AT & T syntaxe comme ceci:mov %rax, QWORD PTR -24[%rbp]
, au lieu de cela:movq -24(%rbp), %rax
..o
fichiers ASM, c'est-à-dire via-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
option, c'est la même--disassembler-options
chose mais beaucoup plus court, par exempleobjdump -d -M intel a.out | less -N
godbolt est un outil très utile, ils ne contiennent que des compilateurs C ++ mais vous pouvez utiliser
-x c
flag pour le faire traiter le code comme C. Il générera ensuite une liste d'assembly pour votre code côte à côte et vous pouvez utiliser l'Colourise
option pour générer des barres colorées pour indiquer visuellement quel code source correspond à l'assembly généré. Par exemple le code suivant:en utilisant la ligne de commande suivante:
et
Colourise
générerait ce qui suit:la source
-masm=intel
mais qu'en est-il du reste?-x c
Avez-vous essayé de
gcc -S -fverbose-asm -O source.c
regarder lesource.s
fichier assembleur généré ?Le code assembleur généré va dans
source.s
(vous pouvez remplacer cela avec-o
assembler-filename ); l'-fverbose-asm
option demande au compilateur d'émettre des commentaires d'assembleur "expliquant" le code assembleur généré. L'-O
option demande au compilateur d'optimiser un peu (il pourrait optimiser davantage avec-O2
ou-O3
).Si vous voulez comprendre ce qui
gcc
se passe, essayez de passer-fdump-tree-all
mais soyez prudent: vous obtiendrez des centaines de fichiers de vidage.BTW, GCC est extensible via des plugins ou avec MELT (un langage spécifique de domaine de haut niveau pour étendre GCC; que j'ai abandonné en 2017)
la source
source.s
, car beaucoup de gens s'attendraient à une impression sur la console.-S -o-
sur stdout.-masm=intel
est utile si vous souhaitez utiliser la syntaxe NASM / YASM. (mais il utiliseqword ptr [mem]
, plutôt que justeqword
, donc c'est plus comme Intel / MASM que NASM / YASM). gcc.godbolt.org fait un bon travail de nettoyage du vidage: en supprimant éventuellement les lignes de commentaires uniquement, les étiquettes inutilisées et les directives d'assembleur.-Og
c'est encore mieux que-O1
. Cela signifie "optimiser pour le débogage" et rend asm sans trop d'optimisations difficiles / difficiles à suivre qui fait tout ce que dit la source. Il est disponible depuis gcc4.8, mais clang 3.7 ne l'a toujours pas. IDK s'ils ont décidé contre ou quoi.Vous pouvez utiliser gdb pour cela comme objdump.
Cet extrait est tiré de http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Voici un exemple montrant un assemblage source + mixte pour Intel x86:
la source
set disassembly-flavor intel
commande.Utilisez le commutateur -S (note: S majuscule) vers GCC, et il émettra le code assembleur dans un fichier avec une extension .s. Par exemple, la commande suivante:
gcc -O2 -S -c foo.c
la source
Je n'ai pas donné de chance à gcc, mais dans le cas de g ++. La commande ci-dessous fonctionne pour moi. -g pour la version de débogage et -Wa, -adhln est passé à l'assembleur pour être répertorié avec le code source
g ++ -g -Wa, -adhln src.cpp
la source
utilisez -Wa, -adhln comme option sur gcc ou g ++ pour produire une sortie de listage vers stdout.
-Wa, ... est pour les options de ligne de commande pour la partie assembleur (exécuter dans gcc / g ++ après la compilation C / ++). Il appelle en interne (as.exe dans Windows). Voir
> comme --help
comme ligne de commande pour voir plus d'aide pour l'outil d'assemblage dans gcc
la source