爲什麼我們有不同架構的鏈接器?鏈接器的服務是解析地址。那麼它如何與目標架構的指令相關?鏈接器和體系結構
鏈接器和體系結構
回答
有很多很多原因,我不能詳盡地列出所有的原因。
當體系結構不支持位置無關的代碼時,連接器需要做更多的工作。在那些情況下,即使跳內的功能也需要解決。
接頭需要創建體系結構特定的報頭,如ELF或PE頭。
鏈接器需要包括資源,數據叉或類似的事情的平臺上支持他們
鏈接器需要實例出口C++模板
鏈接器還需要處理,不能尚未解決地址。這可以包括系統調用或動態加載的庫。
鏈接動態庫,鏈接器需要更多的出口不是一個單一的入口函數。不同的體系結構uuse不同的方法,以指示哪些功能被導出
接頭可能需要插入實際呼叫序列,如果他們不能在編譯時被確定。例如。對於支持兩個指令集的體系結構,只要調用者和被調用者在使用的指令集中不同,就需要插入「指令集開關」。
鏈接的優化可以基於體系結構相關的細節。例如。如果4KB區域內的函數調用速度更快,則可以將調用者和被調用者放在一起。
內聯跨越目標文件可以做到,但需要去除的呼叫建立,被叫序言,被叫收尾和返回值的處理。這些都是特定於架構的,所以只是承認它們已經採用了架構特定的鏈接器。
不同的體系結構在其指令中有不同的地址格式,鏈接器必須知道它們才能操作它們。
根據相對地址的大小,相對尋址可能會導致不同的指令。例如,對於ARM,還存在更復雜的方案。
通常它是在補充鏈接格式的說明書中描述,例如看看從this Wikipedia article on the ELF format鏈接的文檔。
要解析地址鏈接器需要至少知道地址的性質和大小。某些體系結構(如x86實模式)具有相當複雜的尋址方案,其中一些嵌入指令中的地址,因此鏈接器可能需要知道地址或偏移量字段。
可以構建一些連接器來理解多種體系結構。例如,我爲我的交叉編譯器項目http://ellcc.org使用gnu ld,gdb,binutils和彙編程序。我有一個針對每個目標的彙編器,但鏈接器,調試器和binutils都可以理解所有的處理器。支持的處理器非常多樣:ARM,CellSPU,Mips,MSP430,Nios2,PIC16,PowerPC,PowerPC64,Sparc,X86,X86_64。
一些工具鏈的構建使得當整個程序信息可用時,很大一部分優化被推遲到鏈接時間。內聯,不斷傳播和許多其他傳統優化的好處,都適用於整個二進制文件,而不僅僅是每個對象。
- 1. GNU鏈接器和體系結構i386
- 2. Solaris上的鏈接器和體系結構類型錯誤
- 3. 實體框架是連接體系結構還是非連接體系結構?
- 4. 三層體系結構和控制器
- 5. 管道和過濾器體系結構
- 6. 三層體系結構與三層服務器體系結構
- 7. VHDL結構體系結構和clk'event
- 8. 針對體系結構i386和armv7的Openssl Mach-O鏈接器錯誤
- 9. Selenium RC體系結構和Selenium WebDriver體系結構差異
- 10. Android:Manager和SystemService體系結構
- 11. 體系結構和Microsoft.AspNet.Providers
- 12. Java連接器體系結構和TCP/IP
- 13. 數組和鏈接結構
- 14. ARM體系結構和系列
- 15. 結合MVVM和N層體系結構
- 16. 體系結構x86_64的未定義符號:鏈接錯誤?
- 17. 鏈接結構
- 18. 通用體系結構項目上具有-ObjC鏈接器標誌會導致Mach-O鏈接器錯誤?
- 19. MVC體系結構
- 20. Graphql體系結構
- 21. Rails體系結構?
- 22. mongodb體系結構
- 23. Firebug體系結構
- 24. CakePHP體系結構
- 25. Elasticsearch體系結構
- 26. Zend Framework的體系結構+ Facebook連接
- 27. WebSphere MQ連接體系結構
- 28. Xcode鏈接器錯誤:文件對於體系結構x86_64太小
- 29. 鏈接器命令錯誤:爲體系結構i386找不到'ld:symbol(s)'
- 30. 如何鏈接64位編譯器(體系結構)的32位框架
請參閱http://www.iecc.com/linker/ – bobobobo