我该如何强制GDB进行反汇编?
我试图反汇编一个程序来查看系统调用汇编指令(INT指令,我相信)和GDB的处理程序,并已经写了一个小程序(见下文)打开和closures文件。 我可以跟着电话打到GDB,直到执行了一个电话。 当我试图告诉GDB“反汇编0x …”(调用地址)时,它以“无function包含指定地址”作为响应。 是否有可能强制GDB反汇编(或汇编器尽可能好地显示)该内存地址? 如果是这样,怎么样?
#include <stdio.h> #include <stdlib.h> int main() { FILE* f; f = fopen("main.c", "r"); if (!f) { perror("open"); return -1; } fclose(f); return 0; }
你只是想拆解你的主要? 如果是这样的话:
(gdb) info line main (gdb) disas STARTADDRESS ENDADDRESS
像这样:
USER@MACHINE /cygdrive/c/prog/dsa $ gcc-3.exe -g main.c USER@MACHINE /cygdrive/c/prog/dsa $ gdb a.exe GNU gdb 6.8.0.20080328-cvs (cygwin-special) ... (gdb) info line main Line 3 of "main.c" starts at address 0x401050 <main> and ends at 0x401075 <main+ (gdb) disas 0x401050 0x401075 Dump of assembler code from 0x401050 to 0x401075: 0x00401050 <main+0>: push %ebp 0x00401051 <main+1>: mov %esp,%ebp 0x00401053 <main+3>: sub $0x18,%esp 0x00401056 <main+6>: and $0xfffffff0,%esp 0x00401059 <main+9>: mov $0x0,%eax 0x0040105e <main+14>: add $0xf,%eax 0x00401061 <main+17>: add $0xf,%eax 0x00401064 <main+20>: shr $0x4,%eax 0x00401067 <main+23>: shl $0x4,%eax 0x0040106a <main+26>: mov %eax,-0xc(%ebp) 0x0040106d <main+29>: mov -0xc(%ebp),%eax 0x00401070 <main+32>: call 0x4010c4 <_alloca> End of assembler dump.
但是我没有看到你的系统中断呼叫。 (自从我上次试图在汇编中进行系统调用以来,它已经有一段时间了,尽pipe如此,我还记得
是的,拆卸不是在这里使用的最好的命令。 你想要的命令是“x / i”(查看指令):
(gdb) x/i 0xdeadbeef
这不是你的问题的直接答案,但因为你似乎只是想反汇编的二进制文件,也许你可以只使用objdump
:
objdump -d program
这应该给你它的解体。 你可以添加-S
如果你想要源注释。
fopen()是一个C库函数,所以你不会在你的代码中看到任何系统调用指令,只是一个常规的函数调用。 在某些时候,它确实叫(2),但它通过蹦床。 简单地说就是跳到由内核提供给每个进程的VDSO页面。 VDSO然后提供代码来进行系统调用。 在现代处理器上,将使用SYSCALL或SYSENTER指令,但也可以在x86处理器上使用INT 80h。
通过添加-S开关,可以强制gcc直接输出到汇编代码
gcc -S hello.c
如果你想要看到INTC调用的反汇编,请使用objdump -d作为提到的人,但在编译时使用-static选项。 否则,fopen函数不会被编译到elf中,而是在运行时被链接。
gdb反汇编有一个/ m包括源代码旁边的说明。 这相当于objdump -S,仅仅局限于一个感兴趣的函数(或地址范围)。
你不必使用gdb。 GCC将做到这一点。
gcc -S foo.c
这将创buildfoo.s这是大会。
gcc -m32 -c -g -Wa,-a,-ad foo.c > foo.lst
上述版本将创build一个列表文件,其中包含C和由其生成的程序集。 GCC常见问题