我正在尝试反汇编程序以查看系统调用汇编指令(我相信INT指令)和GDB处理程序,并编写了一个程序(见下文),用于打开和关闭文件。< / p>
我能够跟随调用以使用GDB进行fopen直到它执行一次调用。
当我试图告诉GDB“反汇编0x ....”(调用地址)时,它回答“没有函数包含指定的地址。”
是否有可能强制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;
}
答案 0 :(得分:90)
是的,反汇编不是在这里使用的最佳命令。 你想要的命令是“x / i”(作为指令检查):
(gdb) x/i 0xdeadbeef
答案 1 :(得分:45)
你只想拆卸你的实际主力吗?如果是这样,试试这个:
(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.
但是我没有看到你的系统中断调用。 (自从我上次尝试在汇编中进行系统调用以来已经有一段时间了。虽然INT 21h,但最后我还记得
答案 2 :(得分:30)
这不是您问题的直接答案,但由于您似乎只是想反汇编二进制文件,也许您可以使用objdump
:
objdump -d program
这应该给你它的反汇编。如果您想要源注释,可以添加-S
。
答案 3 :(得分:7)
fopen()是一个C库函数,因此您不会在代码中看到任何系统调用指令,只是常规函数调用。在某些时候,它确实调用open(2),但它通过蹦床实现。只需跳转到VDSO页面,该页面由内核提供给每个进程。然后,VDSO提供用于进行系统调用的代码。在现代处理器上,将使用SYSCALL或SYSENTER指令,但您也可以在x86处理器上使用INT 80h。
答案 4 :(得分:6)
您可以通过添加-S开关
强制gcc直接输出到汇编代码gcc -S hello.c
答案 5 :(得分:3)
如果你想要的只是通过INTC调用来查看反汇编,请使用objdump -d作为提到的人,但在编译时使用-static选项。否则,fopen函数不会编译到elf中并在运行时链接。
答案 6 :(得分:1)
您不必使用gdb。海湾合作委员会会这样做。
gcc -S foo.c
这将创建foo.s,这是程序集。
gcc -m32 -c -g -Wa,-a,-ad foo.c > foo.lst
上述版本将创建一个列表文件,其中包含C和由其生成的程序集。 GCC FAQ
答案 7 :(得分:1)
gdb反汇编有一个/ m包含源代码和指令。这相当于objdump -S,具有仅限于感兴趣的一个函数(或地址范围)的额外好处。