2013-07-09 24 views
0

Visual C++項目,Wintel-32。我有一個C文件編譯爲對象,然後鏈接,非常香草安裝。調試配置。COMDAT部分放置在可執行文件中

當我用dumpbin /symbols檢查目標文件時,它告訴我我的目標文件有許多代碼(「COMDAT」)部分 - 看起來每個函數都有一個。它們都被命名爲.text,鏈接器會將它們合併到最終可執行文件中的一個大的.text段中。

在項目設置中禁用功能級鏈接。我甚至不確定爲什麼COMDAT首先被生成。

但我注意到在調試器中,那些OBJ級別的部分(函數)不會在可執行文件中連續執行。在它們之間有一些填充 - 幾十個字節的int 3指令 - 明顯是控制不應該去的死空間。函數邊界全部由16個字節對齊,但還有更多 - 這不僅僅是16字節的對齊,或者在大多數情況下填充會少得多。它通常在20-40字節左右,但我見過一些異常值 - 這裏有11個字節的填充,73。

這與鏈接器的/ ALIGN選項無關 - 那個處理正確的部分。它的默認值是4K,絕對不是我們這裏所擁有的。

爲什麼這個填充?它的大小算法是什麼(絕對不是單純的對齊)?

+0

你有編輯和繼續爲這個項目打開? –

+0

採取了點。用/ Zi取代/ ZI,COM​​DAT的走了。作出回答,我會接受。 –

+0

你有一個答案。 –

回答

0

如果您有編輯&繼續爲項目打開,則會看到您看到的填充,以便編譯器和鏈接器可以修補可執行映像,而不必重新構建和重新鏈接它。