Ich lerne gerade ASM-Programmierung und möchte eine Datei disassemblieren .c
. Nach der Ausführung der Befehlszeile
set disassembly-flavor test.c
Ich verwende den Befehl:
disassembly test.c
und mein Terminal zeigte
disassemble: command not found
Weiß jemand, ob ich den Befehl „disassemblieren“ auf meinem Computer bekommen kann?
Danke
Antwort1
Erstens handelt es sich bei einer Datei mit einer .c
Erweiterung höchstwahrscheinlich um eine C-Quelldatei. Es hat keinen Sinn, sie zu zerlegen. Um zu überprüfen, ob eine Datei tatsächlich ein Programm ist, verwenden Sie den folgenden file
Befehl:
$ 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
Verwenden Sie zum Disassemblieren objdump
stattdessen. Aus der Manpage:
NAME
objdump - display information from object files.
SYNOPSIS
objdump [...]
[-d|--disassemble]
Um beispielsweise eine Datei mit dem Namen zu disassemblieren a.out
, verwenden Sie
$ 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...
Antwort2
Ich denke, was Sie wollen, ist eine Funktion von gdb, dem GNU-Debugger, der einen Disassemblierungsbefehl hat. Zuerst würden Sie test.c mit aktivierten Debugging-Flags kompilieren, wie folgt:
gcc -Wall -g -o test test.c
oder so ähnlich. Dann führen Sie die Anwendung mit gdb als Argument aus:
gdb test
Sobald Sie in gdb sind, können Sie den Disassemblierungsbefehl wie folgt verwenden:
(gdb) break main
(gdb) disassemble main
Nehmen Sie dieses triviale Programm namens 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;
}
jetzt werde ich es kompilieren, mit Debug-Flags:
g++ -Wall -g test.cpp -o test
Dann sagen Sie: „Aber j0h, das ist eine C-Frage …“, worauf ich antworte: GDB ist es egal, welche Sprache Sie verwenden. Sie können C, C++, Assembler, Fortran und eine Vielzahl anderer Dinge debuggen und disassemblieren. Kompilieren Sie einfach mit der Option -g, das ist wichtig.
Sobald wir das Programm in gdb geladen und main unterbrochen haben, können wir disassemblieren:
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---
Hier ist ein Tutorial: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html
objdump kann den Inhalt auflisten, aber ich glaube nicht, dass Sie mit Ihrem Code auf die gleiche Weise interagieren können, als wenn Sie den Debugger verwenden.