我听说如果编译时启用了调试(-g),则可以从可执行文件中获取源代码。这是真的?如果是这样,怎么会去做呢?
答案 0 :(得分:1)
您无法从二进制可执行文件恢复源代码。 您可以使用REC Studio或Boomerang之类的反编译器将反汇编的二进制文件转换为c代码,但此代码不会像您编译的初始代码那样。它更像是用C语法编写的汇编。如果您的应用程序很复杂,它可能无法编译。调试符号可以提供帮助,但不是很多。编译过程中丢失了许多信息,无法恢复。
答案 1 :(得分:0)
您可以使用objdump实用程序。 objdump有选项'-S',它还提供源代码和相应的汇编代码。这也有助于调试崩溃(分段错误)。
e.g。我复制了代码片段及其objdump(仅作为示例)。 只复制了objdump的main(),它也包含其他信息。
要做的步骤: 假设您在文件temp.c中编写了代码。
gcc -g temp.c -o temp
objdump -DS temp > temp.dump
#include <stdio.h>
int main()
{
int a, *b;
a = 0;
b = 0;
printf("a=%d *b=%d", a, *b);
return 0;
}
0804841d <main>:
#include <stdio.h>
int main()
{
804841d: 55 push %ebp
804841e: 89 e5 mov %esp,%ebp
8048420: 83 e4 f0 and $0xfffffff0,%esp
8048423: 83 ec 20 sub $0x20,%esp
int a, *b;
a = 0;
8048426: c7 44 24 18 00 00 00 movl $0x0,0x18(%esp)
804842d: 00
b = 0;
804842e: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
8048435: 00
printf("a=%d *b=%d", a, *b);
8048436: 8b 44 24 1c mov 0x1c(%esp),%eax
804843a: 8b 00 mov (%eax),%eax
804843c: 89 44 24 08 mov %eax,0x8(%esp)
8048440: 8b 44 24 18 mov 0x18(%esp),%eax
8048444: 89 44 24 04 mov %eax,0x4(%esp)
8048448: c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp)
804844f: e8 9c fe ff ff call 80482f0 <printf@plt>
return 0;
8048454: b8 00 00 00 00 mov $0x0,%eax
}
8048459: c9 leave
804845a: c3 ret
804845b: 66 90 xchg %ax,%ax
804845d: 66 90 xchg %ax,%ax
804845f: 90 nop