c - 带有调试信息的二进制文件的 objdump 产生损坏的输出

标签 c debugging objdump

我经常注意到 objdump -S 的输出中混合了汇编和 C 指令的严重损坏的输出。这似乎只发生在使用调试信息构建的二进制文件中。有什么办法可以解决这个问题吗?

为了说明这个问题,我写了一个简单的程序:

/* test.c */
#include <stdio.h>
int main()
{
        static int i = 0;    
        while(i < 0x1000000) {
                i++;
        }
        return 0;
}

上面的程序是在有/没有调试信息的情况下构建的,如下所示:

$ gcc test.c -o test-release
$ gcc test.c -g -o test-debug

反汇编测试发布二进制文件工作正常。
$ objdump -S 测试发布
main() 函数生成以下清晰简洁的片段。

 080483b4 <main>:
 80483b4:       55                      push   %ebp
 80483b5:       89 e5                   mov    %esp,%ebp
 80483b7:       eb 0d                   jmp    80483c6 <main+0x12>
 80483b9:       a1 18 a0 04 08          mov    0x804a018,%eax
 80483be:       83 c0 01                add    $0x1,%eax
 80483c1:       a3 18 a0 04 08          mov    %eax,0x804a018
 80483c6:       a1 18 a0 04 08          mov    0x804a018,%eax
 80483cb:       3d ff ff ff 00          cmp    $0xffffff,%eax
 80483d0:       7e e7                   jle    80483b9 <main+0x5>
 80483d2:       b8 00 00 00 00          mov    $0x0,%eax
 80483d7:       5d                      pop    %ebp
 80483d8:       c3                      ret 

但是 $ objdump -S test-debug
为相同的 main() 函数生成以下损坏的代码段。

080483b4 <main>:
#include <stdio.h>

int main()
{
 80483b4:       55                      push   %ebp
 80483b5:       89 e5                   mov    %esp,%ebp

        static int i = 0;

        while(i < 0x1000000) {
 80483b7:       eb 0d                   jmp    80483c6 <main+0x12>
                i++;
 80483b9:       a1 18 a0 04 08          mov    0x804a018,%eax
 80483be:       83 c0 01                add    $0x1,%eax
 80483c1:       a3 18 a0 04 08          mov    %eax,0x804a018
int main()
{

        static int i = 0;

        while(i < 0x1000000) {
 80483c6:       a1 18 a0 04 08          mov    0x804a018,%eax
 80483cb:       3d ff ff ff 00          cmp    $0xffffff,%eax
 80483d0:       7e e7                   jle    80483b9 <main+0x5>
                i++;
        }   

        return 0;
 80483d2:       b8 00 00 00 00          mov    $0x0,%eax

}
 80483d7:       5d                      pop    %ebp
 80483d8:       c3                      ret

我确实理解,由于调试二进制文件包含额外的符号信息,因此 C 代码与汇编指令交错显示。但这使得遵循代码流有点困难。

Is there any way to instruct objdump to output pure assembly and not interlace debug symbols into the output even if encountered in a binary?

最佳答案

使用 -d 而不是 -S。 objdump 正在按照您的指示进行操作。 -S 选项隐含 -d,但如果调试信息可用,也会显示 C 源代码。

关于c - 带有调试信息的二进制文件的 objdump 产生损坏的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033573/

相关文章:

gcc - 在 32 位机器上编译的汇编代码与使用 "gcc -m32"编译的代码不同吗?

卷积函数延迟瓶颈

c - 以多线程方式进行矩阵乘法

c++ - 是否存在我遗漏的运算符优先级问题? unsigned short 与 inverse 的比较失败

python - django 中的 PyCallGraph 中间件

shared-libraries - Linux ELF 文件 : How to get the shared object belonging to an imported function

c - 直接从 C 中的(共享)内存执行二进制/elf 文件

c - 为什么我的客户端没有收到任何字节?

java - 通过将源代码复制到我的项目来调试 rt.jar 中的类

eclipse - 在 Eclipse 中调试时不显示变量