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
objdumppara producir un desmontaje más legible.objdump -drwC -Minteles bueno:-rmuestra los nombres de los símbolos en las reubicaciones (por lo que veríaputsen lascallinstrucciones a continuación)-Rmuestra reubicaciones de enlace dinámico / nombres de símbolos (útil en bibliotecas compartidas)-Cdemanda los nombres de símbolos de C ++-wes el modo "ancho": no ajusta en línea los bytes del código de máquina-Mintel: use la.intel_syntax noprefixsintaxis 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~/.bashrcEjemplo:
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 comoverboseconobjdump? Para que pueda tener comentarios en el código asm, como lo hace-fverbose-asmen gcc?-fverbose-asmadicionales que se agregan están en forma de comentarios en la sintaxis asm de la salida, no directivas que agregarán algo extra al.oarchivo. 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-cpara detenerse en la creación de archivos de objetos sin intentar vincular, o lo que sea.-save-tempses interesante ya que voltea de una vez el código exacto generado, mientras que la otra opción de llamar al compilador-Ssignifica compilar dos veces, y posiblemente con diferentes opciones. Pero-save-tempsvuelca 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
-Scambio a GCC en sistemas basados en x86 produce un volcado de sintaxis de AT&T, por defecto, que se puede especificar con el-masm=attcambio, de la siguiente manera:Mientras que si desea generar un volcado en la sintaxis de Intel, puede usar el
-masm=intelconmutador de esta manera:(Ambos producen volcados de
code.csus diversas sintaxis, en el archivocode.srespectivamente)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..oy archivos ASM, es decir, a través de-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm-Mopción, es lo mismo--disassembler-optionspero mucho más corto, por ejemploobjdump -d -M intel a.out | less -Ngodbolt es una herramienta muy útil, la lista solo tiene compiladores de C ++, pero puede usar
-x cflag 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 laColouriseopció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
Colourisegeneraría lo siguiente:fuente
-masm=intelpero ¿qué pasa con el resto?-x c¿Intentó
gcc -S -fverbose-asm -O source.cluego buscar en elsource.sarchivo ensamblador generado ?El código de ensamblador generado entra
source.s(puede anularlo con-oassembler-filename ); la-fverbose-asmopción le pide al compilador que emita algunos comentarios del ensamblador "explicando" el código del ensamblador generado. La-Oopción le pide al compilador que optimice un poco (podría optimizar más con-O2o-O3).Si desea comprender lo que
gccestá haciendo, intente pasar,-fdump-tree-allpero 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=inteles ú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.-Oges 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:
(gdb) disas / m principal Volcado del código del ensamblador para la función main: 5 { 0x08048330: push% ebp 0x08048331: mov% esp,% ebp 0x08048333: sub $ 0x8,% esp 0x08048336: y $ 0xfffffff0,% esp 0x08048339: sub $ 0x10,% esp 6 printf ("Hola. \ N"); 0x0804833c: movl $ 0x8048440, (% esp) 0x08048343: llame al 0x8048284 7 devuelve 0; 8} 0x08048348: mov $ 0x0,% eax 0x0804834d: salir 0x0804834e: ret Fin del volcado del ensamblador.fuente
set disassembly-flavor intelcomando.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