Me preguntaba cómo usar GCC en mi archivo fuente C para volcar una versión mnemónica del código de máquina para poder ver en qué se estaba compilando mi código. Puede hacer esto con Java, pero no he podido encontrar una manera con GCC.
Estoy tratando de reescribir un método C en ensamblador y ver cómo funciona GCC sería de gran ayuda.
Respuestas:
Si compila con símbolos de depuración, puede usar
objdump
para producir un desmontaje más legible.objdump -drwC -Mintel
es bueno:-r
muestra los nombres de los símbolos en las reubicaciones (por lo que veríaputs
en lascall
instrucciones a continuación)-R
muestra reubicaciones de enlace dinámico / nombres de símbolos (útil en bibliotecas compartidas)-C
demanda los nombres de símbolos de C ++-w
es el modo "ancho": no ajusta en línea los bytes del código de máquina-Mintel
: use la.intel_syntax noprefix
sintaxis similar a MASM de GAS / binutils en lugar de AT&T-S
: intercalar líneas de origen con desmontaje.Podrías poner algo como
alias disas="objdump -drwCS -Mintel"
en tu~/.bashrc
Ejemplo:
fuente
-Wa,-adhln -g to gcc
. Esto supone que el ensamblador es gas y este no siempre es el caso.-Mintel
.Si le das la bandera a GCC
-fverbose-asm
, seráfuente
objdump
-objdump -drwCS -Mintel
, ¿cómo puedo usar algo comoverbose
conobjdump
? Para que pueda tener comentarios en el código asm, como lo hace-fverbose-asm
en gcc?-fverbose-asm
adicionales que se agregan están en forma de comentarios en la sintaxis asm de la salida, no directivas que agregarán algo extra al.o
archivo. Todo se descarta en el momento del montaje. Mire la salida del compilador asm en lugar del desensamblaje, por ejemplo, en godbolt.org, donde puede emparejarla fácilmente con la línea fuente a través del mouseover y resaltar el color de las líneas fuente / asm correspondientes. ¿Cómo eliminar el "ruido" de la salida del conjunto GCC / clang?Extraído directamente de http://www.delorie.com/djgpp/v2faq/faq8_20.html (pero eliminando erróneamente
-c
)fuente
gcc -march=native -O3 -save-temps
. Todavía puede usar-c
para detenerse en la creación de archivos de objetos sin intentar vincular, o lo que sea.-save-temps
es interesante ya que voltea de una vez el código exacto generado, mientras que la otra opción de llamar al compilador-S
significa compilar dos veces, y posiblemente con diferentes opciones. Pero-save-temps
vuelca todo en el directorio actual, que es un poco desordenado. Parece que está más pensado como una opción de depuración para GCC que como una herramienta para inspeccionar su código.El uso del
-S
cambio a GCC en sistemas basados en x86 produce un volcado de sintaxis de AT&T, por defecto, que se puede especificar con el-masm=att
cambio, de la siguiente manera:Mientras que si desea generar un volcado en la sintaxis de Intel, puede usar el
-masm=intel
conmutador de esta manera:(Ambos producen volcados de
code.c
sus diversas sintaxis, en el archivocode.s
respectivamente)Para producir efectos similares con objdump, querrás usar el modificador
--disassembler-options=
intel
/att
, un ejemplo (con volcados de código para ilustrar las diferencias en la sintaxis):y
fuente
gcc -S -masm=intel test.c
¿no es exactamente el trabajo para mí, tengo algunos cruce de Intel y AT & T sintaxis de la siguiente manera:mov %rax, QWORD PTR -24[%rbp]
en lugar de esto:movq -24(%rbp), %rax
..o
y archivos ASM, es decir, a través de-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
opción, es lo mismo--disassembler-options
pero mucho más corto, por ejemploobjdump -d -M intel a.out | less -N
godbolt es una herramienta muy útil, la lista solo tiene compiladores de C ++, pero puede usar
-x c
flag para que trate el código como C. Luego generará una lista de ensamblaje para su código de lado a lado y puede usar laColourise
opción para generar barras de colores para indicar visualmente qué código fuente se asigna al ensamblaje generado. Por ejemplo el siguiente código:usando la siguiente línea de comando:
y
Colourise
generaría lo siguiente:fuente
-masm=intel
pero ¿qué pasa con el resto?-x c
¿Intentó
gcc -S -fverbose-asm -O source.c
luego buscar en elsource.s
archivo ensamblador generado ?El código de ensamblador generado entra
source.s
(puede anularlo con-o
assembler-filename ); la-fverbose-asm
opción le pide al compilador que emita algunos comentarios del ensamblador "explicando" el código del ensamblador generado. La-O
opción le pide al compilador que optimice un poco (podría optimizar más con-O2
o-O3
).Si desea comprender lo que
gcc
está haciendo, intente pasar,-fdump-tree-all
pero tenga cuidado: obtendrá cientos de archivos de volcado.Por cierto, GCC es extensible a través de complementos o con MELT (un lenguaje específico de dominio de alto nivel para extender GCC; que abandoné en 2017)
fuente
source.s
, ya que mucha gente esperaría una impresión en la consola.-S -o-
volcados a stdout.-masm=intel
es útil si desea utilizar la sintaxis NASM / YASM. (pero usaqword ptr [mem]
, en lugar de soloqword
, por lo que es más como Intel / MASM que NASM / YASM). gcc.godbolt.org hace un buen trabajo al ordenar el volcado: opcionalmente, elimina las líneas de solo comentario, las etiquetas no utilizadas y las directivas de ensamblador.-Og
es incluso mejor que-O1
. Significa "optimizar para la depuración" y crea asm sin demasiadas optimizaciones difíciles / difíciles de seguir que hacen todo lo que dice la fuente. Ha estado disponible desde gcc4.8, pero clang 3.7 todavía no lo tiene. IDK si decidieron en contra o qué.Puede usar gdb para esto como objdump.
Este extracto está tomado de http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Aquí hay un ejemplo que muestra fuente mixta + ensamblaje para Intel x86:
fuente
set disassembly-flavor intel
comando.Use el interruptor -S (nota: S mayúscula) a GCC, y emitirá el código de ensamblaje a un archivo con una extensión .s. Por ejemplo, el siguiente comando:
gcc -O2 -S -c foo.c
fuente
No le he dado una inyección a gcc, pero en el caso de g ++. El siguiente comando funciona para mí. -g para la compilación de depuración y -Wa, -adhln se pasa al ensamblador para que aparezca con el código fuente
g ++ -g -Wa, -adhln src.cpp
fuente
use -Wa, -adhln como opción en gcc o g ++ para producir una salida de listado a stdout.
-Wa, ... es para las opciones de línea de comandos para la parte del ensamblador (ejecutar en gcc / g ++ después de la compilación C / ++). Se invoca como internamente (as.exe en Windows). Ver
> como --ayuda
como línea de comando para ver más ayuda sobre la herramienta ensambladora dentro de gcc
fuente