2009-11-05 56 views

回答

9

有很多很多原因,我不能詳盡地列出所有的原因。

  • 當體系結構不支持位置無關的代碼時,連接器需要做更多的工作。在那些情況下,即使跳內的功能也需要解決。

  • 接頭需要創建體系結構特定的報頭,如ELF或PE頭。

  • 鏈接器需要包括資源,數據叉或類似的事情的平臺上支持他們

  • 鏈接器需要實例出口C++模板

  • 鏈接器還需要處理,不能尚未解決地址。這可以包括系統調用或動態加載的庫。

  • 鏈接動態庫,鏈接器需要更多的出口不是一個單一的入口函數。不同的體系結構uuse不同的方法,以指示哪些功能被導出

  • 接頭可能需要插入實際呼叫序列,如果他們不能在編譯時被確定。例如。對於支持兩個指令集的體系結構,只要調用者和被調用者在使用的指令集中不同,就需要插入「指令集開關」。

  • 鏈接的優化可以基於體系結構相關的細節。例如。如果4KB區域內的函數調用速度更快,則可以將調用者和被調用者放在一起。

  • 內聯跨越目標文件可以做到,但需要去除的呼叫建立,被叫序言,被叫收尾和返回值的處理。這些都是特定於架構的,所以只是承認它們已經採用了架構特定的鏈接器。

4

不同的體系結構在其指令中有不同的地址格式,鏈接器必須知道它們才能操作它們。

根據相對地址的大小,相對尋址可能會導致不同的指令。例如,對於ARM,還存在更復雜的方案。

通常它是在補充鏈接格式的說明書中描述,例如看看從this Wikipedia article on the ELF format鏈接的文檔。

1

要解析地址鏈接器需要至少知道地址的性質和大小。某些體系結構(如x86實模式)具有相當複雜的尋址方案,其中一些嵌入指令中的地址,因此鏈接器可能需要知道地址或偏移量字段。

0

可以構建一些連接器來理解多種體系結構。例如,我爲我的交叉編譯器項目http://ellcc.org使用gnu ld,gdb,binutils和彙編程序。我有一個針對每個目標的彙編器,但鏈接器,調試器和binutils都可以理解所有的處理器。支持的處理器非常多樣:ARM,CellSPU,Mips,MSP430,Nios2,PIC16,PowerPC,PowerPC64,Sparc,X86,X86_64。

0

一些工具鏈的構建使得當整個程序信息可用時,很大一部分優化被推遲到鏈接時間。內聯,不斷傳播和許多其他傳統優化的好處,都適用於整個二進制文件,而不僅僅是每個對象。