¿Utiliza GCC para producir un ensamblaje legible?

Me preguntaba cómo usar GCC en mi archivo fuente C para volcar una versión mnemotécnica del código máquina para poder ver en qué se estaba comstackndo mi código. Puede hacer esto con Java, pero no he podido encontrar la manera de hacerlo con GCC.

Estoy intentando volver a escribir un método C en el ensamblaje y ver cómo lo hace GCC sería de gran ayuda.

Si comstack con símbolos de depuración, puede usar objdump para producir un desensamble más legible.

 >objdump --help [...] -S, --source Intermix source code with disassembly -l, --line-numbers Include line numbers and filenames in output 

objdump -drwC -Mintel es agradable:

  • -r muestra los nombres de los símbolos en las reubicaciones (por lo que vería puts en la instrucción de call continuación)
  • -R muestra relocaciones de vinculación dinámica / nombres de símbolo (útiles en bibliotecas compartidas)
  • -C demanda nombres de símbolos C ++
  • -w es el modo “ancho”: no ajusta en línea los bytes de código de máquina
  • -Mintel : utilice la syntax .intel_syntax noprefix tipo MASM similar a MASM en lugar de AT & T
  • -S : intercalar líneas de origen con desassembly.

Podrías poner algo como alias disas="objdump -drwCS -Mintel" en tu ~/.bashrc


Ejemplo:

 > gcc -g -c test.c > objdump -d -M intel -S test.o test.o: file format elf32-i386 Disassembly of section .text: 00000000 
: #include int main(void) { 0: 55 push ebp 1: 89 e5 mov ebp,esp 3: 83 e4 f0 and esp,0xfffffff0 6: 83 ec 10 sub esp,0x10 puts("test"); 9: c7 04 24 00 00 00 00 mov DWORD PTR [esp],0x0 10: e8 fc ff ff ff call 11 return 0; 15: b8 00 00 00 00 mov eax,0x0 } 1a: c9 leave 1b: c3 ret

Me gustaría agregar a estas respuestas que si le das a gcc la bandera -fverbose-asm , el ensamblador que emite será mucho más claro de leer.

Use el interruptor -S (nota: mayúscula S) a GCC, y emitirá el código de ensamblado a un archivo con una extensión .s. Por ejemplo, el siguiente comando:

gcc -O2 -S foo.c

dejará el código ensamblado generado en el archivo foo.s.

Extraído directamente de http://www.delorie.com/djgpp/v2faq/faq8_20.html (pero eliminando la errónea -c )

El uso del interruptor -S a GCC en sistemas basados ​​en x86 produce un volcado de syntax AT & T, por defecto, que se puede especificar con el interruptor -masm=att , así:

 gcc -S -masm=att code.c 

Mientras que si desea generar un volcado en la syntax de Intel, podría usar el -masm=intel , así:

 gcc -S -masm=intel code.c 

(Ambos producen volcados de code.c en su syntax variada, en el code.s respectivamente)

Para producir efectos similares con objdump, querría usar el --disassembler-options= intel / att , un ejemplo (con los volcados de código para ilustrar las diferencias en la syntax):

  $ objdump -d --disassembler-options=att code.c 
  080483c4 
: 80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx 80483c8: 83 e4 f0 and $0xfffffff0,%esp 80483cb: ff 71 fc pushl -0x4(%ecx) 80483ce: 55 push %ebp 80483cf: 89 e5 mov %esp,%ebp 80483d1: 51 push %ecx 80483d2: 83 ec 04 sub $0x4,%esp 80483d5: c7 04 24 b0 84 04 08 movl $0x80484b0,(%esp) 80483dc: e8 13 ff ff ff call 80482f4 80483e1: b8 00 00 00 00 mov $0x0,%eax 80483e6: 83 c4 04 add $0x4,%esp 80483e9: 59 pop %ecx 80483ea: 5d pop %ebp 80483eb: 8d 61 fc lea -0x4(%ecx),%esp 80483ee: c3 ret 80483ef: 90 nop

y

 $ objdump -d --disassembler-options=intel code.c 
  080483c4 
: 80483c4: 8d 4c 24 04 lea ecx,[esp+0x4] 80483c8: 83 e4 f0 and esp,0xfffffff0 80483cb: ff 71 fc push DWORD PTR [ecx-0x4] 80483ce: 55 push ebp 80483cf: 89 e5 mov ebp,esp 80483d1: 51 push ecx 80483d2: 83 ec 04 sub esp,0x4 80483d5: c7 04 24 b0 84 04 08 mov DWORD PTR [esp],0x80484b0 80483dc: e8 13 ff ff ff call 80482f4 80483e1: b8 00 00 00 00 mov eax,0x0 80483e6: 83 c4 04 add esp,0x4 80483e9: 59 pop ecx 80483ea: 5d pop ebp 80483eb: 8d 61 fc lea esp,[ecx-0x4] 80483ee: c3 ret 80483ef: 90 nop

godbolt es una herramienta muy útil, lista solo comstackdores de C ++ pero puede usar -xc flag para que trate el código como C. -xc una lista de ensamblaje para su código uno al lado del otro y puede usar el Colourise 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:

 #include  void func() { printf( "hello world\n" ) ; } 

usando la siguiente línea de comando:

 -xc -std=c99 -O3 

y Colourise generaría lo siguiente:

enter image description here

¿ gcc -S -fverbose-asm -O source.c luego source.s archivo ensamblador de la source.s generada?

El código de ensamblador generado entra en source.s (puede anular eso con -o assembler-filename ); La opción -fverbose-asm le pide al comstackdor que emita algunos comentarios del ensamblador “explicando” el código del ensamblador generado. La opción -O le pide al comstackdor que optimice un poco (podría optimizar más con -O2 o -O2 ).

Si quieres entender lo que está haciendo gcc prueba pasar -fdump-tree-all pero ten cuidado: obtendrás 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).

Puedes 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 main
 Volcado de código de ensamblador para la función principal:
 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 retorno 0;
 8}
 0x08048348: mov $ 0x0,% eax
 0x0804834d: salir
 0x0804834e: ret

 Fin del volcado del ensamblador.

Use el interruptor -S (nota: mayúscula S) a GCC, y emitirá el código de ensamblado a un archivo con una extensión .s. Por ejemplo, el siguiente comando:

gcc -O2 -S -c foo.c

No le he dado una oportunidad a gcc, pero en el caso de g ++. El siguiente comando funciona para mí. -g para la comstackción de depuración y -Wa, -adhln se pasa al ensamblador para el listado con el código fuente

g ++ -g -Wa, -adhln src.cpp