2011-05-05 66 views

回答

1

調用約定會影響代碼生成,因此編譯器會處理它。鏈接器不需要知道這一點。

+0

希望這些名稱的格式不同,以致調用約定中的不一致將導致鏈接時發生錯誤。 – 2011-05-05 14:57:19

+0

@James在導入DLL時,您經常需要指定調用約定,並且它們通常以無損的方式命名。 – 2011-05-05 15:01:03

+0

Heffeman如果該函數是'extern「C」',顯然,調用約定不能被修改爲名稱。如果函數是「extern」C++「',那麼沒有理由不這樣做。 – 2011-05-05 15:30:16

2

調用約定是如何調用函數(參數編制具體的機器代碼,並清理CTACK)和鏈接涉及功能(功能在其地址)來調用。

因此,通常編譯器會生成正確的代碼,併爲確切的函數地址留下「佔位符」,然後鏈接器會將實際地址放在那裏。也就是說,所謂的link-time code generation這兩個都是由鏈接器完成的。

+0

函數地址與調用約定無關,那就是說,調用約定是由編譯器完成的,對嗎? – kern 2011-05-05 14:29:07

+0

@kern:是的,除非涉及LTCG。 – sharptooth 2011-05-05 14:43:00

0

在某些系統上,目標文件只是一堆數據,符號和補丁點。目標文件將告訴鏈接器鏈接代碼的第574字節應該被修補以包含符號Foo和Bar之間差別的MSB,並且鏈接器將這樣做,但鏈接器沒有超出要執行的計算。

在其他一些系統上,鏈接器可能更多地涉及代碼生成。例如,一些ARM處理器可以運行使用16位或32位指令集編碼的代碼。某些類型的代碼只能使用32位指令集有效運行;一些將充分運行,但使用16位集更加緊湊。 ARM鏈接器知道使用每個指令集編寫哪些例程,如果使用一個指令集編寫的代碼嘗試調用使用另一個指令集編寫的函數,鏈接器將生成一個名爲「veneer」的包裝器方法,並具有第一個函數調用。單板將執行調用其他方法所需的操作。即使單板是「代碼」,它完全由鏈接器生成。

編譯器和鏈接器之間確實沒有固定的分工。我見過一些系統,「編譯器」將程序轉換爲「中間」形式,並且鏈接器執行所有真正的代碼生成,並根據事物在內存中的位置進行優化。如前所述,還有一些鏈接器只是一個「修補處理器」。可能在這兩個極端之間的每一個可想象的分工可能都存在於某個系統的某個地方。

相關問題