Actualmente estoy aprendiendo programación ASM y me gustaría desensamblar un archivo .c
. Sin embargo, después de ejecutar la línea de comando
set disassembly-flavor test.c
Yo uso el comando:
disassembly test.c
y mi terminal muestra
disassemble: command not found
¿Alguien sabe cómo puedo obtener el comando "desmontar" en mi computadora?
Gracias
Respuesta1
Primero, un archivo con una .c
extensión probablemente sea un archivo fuente C. No sirve de nada desmontarlo. Para verificar que un archivo realmente es un programa, use el file
comando:
$ file test.c
test.c: ASCII text
$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.24,
BuildID[sha1]=54967822da027467f21e65a1eac7576dec7dd821, stripped
En cuanto al desmontaje, utilícelo objdump
en su lugar. Desde la página de manual:
NAME
objdump - display information from object files.
SYNOPSIS
objdump [...]
[-d|--disassemble]
Entonces, para desmontar, digamos, un archivo llamado a.out
, use
$ objdump -d a.out
a.out: file format elf64-x86-64
Disassembly of section .init:
00000000004003a8 <_init>:
4003a8: 48 83 ec 08 sub $0x8,%rsp
4003ac: 48 8b 05 45 0c 20 00 mov 0x200c45(%rip),%rax # 600ff8 <_DYNAMIC+0x1d0>
4003b3: 48 85 c0 test %rax,%rax
4003b6: 74 05 je 4003bd <_init+0x15>
4003b8: e8 33 00 00 00 callq 4003f0 <__gmon_start__@plt>
4003bd: 48 83 c4 08 add $0x8,%rsp
4003c1: c3 retq
[...] and so on...
Respuesta2
Creo que lo que quieres es una función de gdb, el depurador de gnu, que tiene un comando de desensamblado. Primero, compilarías test.c con los indicadores de depuración activados, así:
gcc -Wall -g -o test test.c
O algo por el estilo. Luego, ejecutarías la aplicación con gdb como argumento:
gdb test
Una vez que esté en gdb, puede usar el comando de desensamblado de esta manera:
(gdb) break main
(gdb) disassemble main
Tome este programa trivial llamado test.cpp:
#include <iostream>
using namespace std;
int main ()
{
int a=0;
for (int b = 0; b < 11; b++){
a=b+2;
cout << a << "\n\t";
}
cout << "Hello World \n";
return 0;
}
ahora lo compilaré, con indicadores de depuración:
g++ -Wall -g test.cpp -o test
Entonces dices, pero j0h, esta es una pregunta de C... a lo que yo digo, a gdb no le importa el idioma que uses. puedes depurar y desensamblar c, c++, ensamblador, fortran y una variedad de otras cosas, simplemente compila con la opción -g, eso es lo importante.
Una vez que cargamos el programa en gdb y rompemos main, ejecutamos el desensamblado:
Breakpoint 1 at 0x4007da
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004007d6 <+0>: push %rbp
0x00000000004007d7 <+1>: mov %rsp,%rbp
0x00000000004007da <+4>: sub $0x10,%rsp
0x00000000004007de <+8>: movl $0x0,-0x4(%rbp)
0x00000000004007e5 <+15>: movl $0x0,-0x8(%rbp)
0x00000000004007ec <+22>: jmp 0x400817 <main+65>
0x00000000004007ee <+24>: mov -0x8(%rbp),%eax
0x00000000004007f1 <+27>: add $0x2,%eax
0x00000000004007f4 <+30>: mov %eax,-0x4(%rbp)
0x00000000004007f7 <+33>: mov -0x4(%rbp),%eax
0x00000000004007fa <+36>: mov %eax,%esi
0x00000000004007fc <+38>: mov $0x601080,%edi
0x0000000000400801 <+43>: callq 0x400670 <_ZNSolsEi@plt>
0x0000000000400806 <+48>: mov $0x400914,%esi
0x000000000040080b <+53>: mov %rax,%rdi
---Type <return> to continue, or q <return> to quit---
Aquí hay un tutorial: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html
objdump puede enumerar el contenido, pero no creo que puedas interactuar con tu código de la misma manera que si usaras el depurador.