簡體   English   中英

具有調試信息的二進制文件的objdump產生錯誤的輸出

[英]objdump of binary with debug info produces mangled output

我經常在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源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM