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