web-dev-qa-db-fra.com

Comment se désassembler en ligne de commande?

J'apprends actuellement la programmation ASM et j'aimerais désassembler un fichier .c. Cependant, après l'exécution de la ligne de commande

set disassembly-flavor test.c

J'utilise la commande:

disassembly test.c

et mon terminal affiché

disassemble: command not found

Est-ce que quelqu'un sait que je peux obtenir la commande "désassembler" sur mon ordinateur?

Merci

2
S7_0

Tout d'abord, un fichier avec l'extension .c est très probablement un fichier source C. Inutile de le démonter. Pour vérifier qu'un fichier est réellement un programme, utilisez la commande file:

$ 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 ce qui concerne le désassemblage, utilisez plutôt objdump. De la page de manuel:

NAME
       objdump - display information from object files.

SYNOPSIS
       objdump [...]
               [-d|--disassemble]

Donc, pour démonter, disons, un fichier nommé a.out, utilisez

$ 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...
6
s3lph

Je pense que ce que vous voulez est une fonction de gdb, le débogueur gnu, qui a une commande de désassemblage. Tout d’abord, vous compileriez test.c avec les indicateurs de débogage, comme ceci: gcc -Wall -g -o test test.c

ou quelque chose de ce genre. Ensuite, vous exécuteriez l'application avec gdb en tant qu'argument:

gdb test

une fois que vous êtes dans gdb, vous pouvez utiliser la commande désassembler comme ceci:

(gdb) break main
(gdb) disassemble main

Prenez ce programme trivial nommé 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;
}

maintenant je vais le compiler, avec les drapeaux de débogage:

g++ -Wall -g test.cpp -o test

Alors vous dites, mais j0h, c’est une question C… à laquelle je dis, gdb ne se soucie pas de la langue que vous utilisez. vous pouvez déboguer et désassembler c, c ++, Assembly, fortran, et une variété d’autres choses, compilez simplement avec l’option -g, c’est ce qui est important.

une fois que nous avons chargé le programme dans gdb, et cassé main, nous pouvons le démonter:

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---

Voici un tutoriel: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html

objdump peut lister le contenu, mais je ne pense pas que vous pourrez interagir avec votre code de la même manière que si vous utilisiez le débogueur.

2
j0h