从使用调试选项编译的C代码获取源代码

时间:2015-08-27 02:28:59

标签: c debugging compilation

我听说如果编译时启用了调试(-g),则可以从可执行文件中获取源代码。这是真的?如果是这样,怎么会去做呢?

2 个答案:

答案 0 :(得分:1)

您无法从二进制可执行文件恢复源代码。 您可以使用REC StudioBoomerang之类的反编译器将反汇编的二进制文件转换为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