为什么我们有不同架构的链接器?链接器的服务是解析地址。那么它如何与目标架构的指令相关?链接器和体系结构
链接器和体系结构
回答
有很多很多原因,我不能详尽地列出所有的原因。
当体系结构不支持位置无关的代码时,连接器需要做更多的工作。在那些情况下,即使跳内的功能也需要解决。
接头需要创建体系结构特定的报头,如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