¿Cómo desensamblar la línea de comando?

¿Cómo desensamblar la línea de comando?

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 .cextensión probablemente sea un archivo fuente C. No sirve de nada desmontarlo. Para verificar que un archivo realmente es un programa, use el filecomando:

$ 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 objdumpen 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.

información relacionada