sábado, 17 de septiembre de 2016

Obtener el ensamblador de un programa en C en Linux.

El otro día me dio curiosidad de ver como se veía las instrucciones en ensamblador de un programa sencillo en C, en Linux. A continuación, muestro el ejemplo que hice de manera sencilla.

Código en C:
Yo decidí, para empezar con algo simple, hacer el dump de un pequeño código usando una sentencia for:

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
  int i;
  for(i = 1; i <= 10; i++);  
  return 0;
}

Nombramos el archivo como main.c

Escribiendo el Makefile 
Para evitarnos el gran trabajo de escribir dos comandos, realizaremos un archivo Makefile que corra automáticamente los comandos con las flags necesarias.

1
2
3
all:
 gcc -g -c main.c -fverbose-asm -O0
 objdump -d -M intel -S main.o 

Cabe destacar que objdump obtendrá el código ensamblador con una sintaxis de intel, como se específica en el flag -M intel; si se desea obtener con otra sintaxis, debe buscarse en la manual del comando.


Obteniendo el ensamblador:
Corremos el siguiente comando:

1
$ make


Y se nos mostrará en la terminal el ensamblador resultado de nuestro código, para este caso específico:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
gcc -g -c main.c -fverbose-asm -O0
objdump -d -M intel -S main.o 

main.o:     formato del fichero elf64-x86-64


Desensamblado de la sección .text:

0000000000000000 <main>:
#include <stdio.h>

int main() {
   0: 55                    push   rbp
   1: 48 89 e5              mov    rbp,rsp
   4: 48 83 ec 10           sub    rsp,0x10
  int i;
  for(i = 1; i <= 10; i++);
   8: c7 45 fc 01 00 00 00  mov    DWORD PTR [rbp-0x4],0x1
   f: eb 04                 jmp    15 <main+0x15>
  11: 83 45 fc 01           add    DWORD PTR [rbp-0x4],0x1
  15: 83 7d fc 0a           cmp    DWORD PTR [rbp-0x4],0xa
  19: 7e f6                 jle    11 <main+0x11>
  i++;
  1b: 83 45 fc 01           add    DWORD PTR [rbp-0x4],0x1
  foo();
  1f: b8 00 00 00 00        mov    eax,0x0
  24: e8 00 00 00 00        call   29 <main+0x29>
  
  return 0;
  29: b8 00 00 00 00        mov    eax,0x0
}
  2e: c9                    leave  
  2f: c3                    ret   

Cualquier duda, comentario o sugerencia es bienvenida en los comentarios!

Interviewbit Question - Solución al problema de la potencia de dos enteros.

Este es un problema de tipo entrevista, encontrado en interviewbit.com. El problema nos menciona que debemos encontrar si dada una entr...