2017-02-21 69 views
0

當我使用-g選項運行gcc時,這使我能夠在使用objdump運行可執行文件時看到一些c代碼。GCC調試選項不尊重預處理器#if使用objdump查看時

我有一個程序在#if塊中有一段代碼。當我使用-g運行gcc並運行objdump時,它會顯示不應包含在#if中的c代碼。

例如用下面的C語言代碼:

#define ENABLED 0 

#if ENABLED 
    startSomething(); 
#endif 

當與gcc -g編譯到startSomething函數調用包括在objdump的輸出。

科objdump的輸出:

261c:  1c19   adds r1, r3, #0 
    261e:  f7fe f9a1  bl  964 <init> 
    } 

    startSomething(); 
#else 

這是預期的行爲?我會想,如果startSomething()的調用和startSomething的實際函數定義被包裝在#if ENABLED中,那麼它不應該被包含,並且gcc應該將其切除。

有沒有辦法讓gcc/objdump更注重預處理程序#ifs,所以我沒有在objdump中得到永遠不會執行的代碼?

感謝您的幫助。

編輯:另外我知道這個函數沒有得到執行時,實際運行的代碼。所以我知道我還沒有在其他地方設置ENABLED。

編輯2:一個很好的觀察是objdump實際上並沒有輸出任何與函數調用相關的asm指令。所以它似乎只是不正確地包含函數調用相關的函數調用c塊。

+2

如您的示例所示,gcc不會編譯'startSomething()'的調用。 (當然不是。)然而,你可能在objdump中看到的是這個函數的原型或實現(與它的調用相反)。爲了證明這一點,一個完整的樣本將是必要的。 – Scheff

+0

@Scheff感謝您的回覆。如果另外它是我在objdump中可以看到的調用,那麼實現也被包裝在一個散列中。 –

+0

我對objdump一無所知。但是,如果您想查看編譯器如何在宏調用後編譯您的代碼,請使用「-E」進行「編譯」。這將顯示宏調用後的C源代碼。 – Scheff

回答

4

Objdump對C或gcc或預處理器沒有絲毫的想法。它具有格式「地址範圍S-E處的指令來自線L上的語句」的信息。給定與L1和L2線相對應的兩個相鄰指令塊,它可能會顯示L1和L2之間的所有線。

這就像調試器將工作。您不希望gdb跳過評論,或者如果在代碼中刪除了部分代碼或空行,

+0

嗯,也許這是我如何使用objdump。對於我來說,看到代碼不是可執行文件的一部分,這非常令人困惑。感謝您的解釋,雖然:) –