當我使用-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塊。
如您的示例所示,gcc不會編譯'startSomething()'的調用。 (當然不是。)然而,你可能在objdump中看到的是這個函數的原型或實現(與它的調用相反)。爲了證明這一點,一個完整的樣本將是必要的。 – Scheff
@Scheff感謝您的回覆。如果另外它是我在objdump中可以看到的調用,那麼實現也被包裝在一個散列中。 –
我對objdump一無所知。但是,如果您想查看編譯器如何在宏調用後編譯您的代碼,請使用「-E」進行「編譯」。這將顯示宏調用後的C源代碼。 – Scheff