현재 ASM 프로그래밍을 배우고 있는데 파일을 분해하고 싶습니다 .c
. 그러나 명령줄을 실행한 후
set disassembly-flavor test.c
나는 다음 명령을 사용합니다.
disassembly test.c
내 터미널이 표시되었습니다
disassemble: command not found
내 컴퓨터에서 "분해" 명령을 받을 수 있는지 아는 사람이 있나요?
감사해요
답변1
첫째, 확장자를 가진 파일은 .c
C 소스 파일일 가능성이 높습니다. 분해해도 소용없습니다. 파일이 실제로 프로그램인지 확인하려면 다음 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
분해는 대신 사용하세요 objdump
. 맨페이지에서:
NAME
objdump - display information from object files.
SYNOPSIS
objdump [...]
[-d|--disassemble]
따라서 이라는 파일을 분해하려면 다음을 a.out
사용하십시오.
$ 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...
답변2
내 생각에 당신이 원하는 것은 disassemble 명령이 있는 gnu 디버거인 gdb의 기능이라고 생각합니다. 먼저 다음과 같이 디버깅 플래그를 켜고 test.c를 컴파일합니다.
gcc -Wall -g -o test test.c
또는 그 라인에 따른 것. 그런 다음 gdb를 인수로 사용하여 애플리케이션을 실행합니다.
gdb test
gdb에 있으면 다음과 같이 disassemble 명령을 사용할 수 있습니다.
(gdb) break main
(gdb) disassemble main
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;
}
이제 디버그 플래그를 사용하여 컴파일하겠습니다.
g++ -Wall -g test.cpp -o test
그렇다면 당신은 이렇게 말하겠지만, j0h, 이것은 C 질문입니다... 내가 말하길, gdb는 당신이 어떤 언어를 사용하든 상관하지 않습니다. C, C++, 어셈블리, 포트란 및 기타 다양한 항목을 디버깅하고 분해할 수 있습니다. -g 옵션을 사용하여 컴파일하면 됩니다. 이것이 중요합니다.
프로그램을 gdb에 로드하고 메인을 중단하면 캠이 디스어셈블을 실행합니다.
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---
다음은 튜토리얼입니다: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html
objdump는 내용을 나열할 수 있지만 디버거를 사용하는 것과 같은 방식으로 코드와 상호 작용할 수는 없을 것 같습니다.