我经常注意到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 test-release
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代码将与汇编指令交错显示。但这使得跟踪代码流有点困难。
是否有任何方法可以指示objdump输出纯程序集,而不是将调试符号交错到输出中,即使在二进制文件中遇到?

最佳答案

使用-d而不是-S。objdump正是按照您的命令执行的。-S选项表示-d,但如果调试信息可用,则还显示C源。

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

10-12 22:35