2009-11-05 57 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

一些工具链的构建使得当整个程序信息可用时,很大一部分优化被推迟到链接时间。内联,不断传播和许多其他传统优化的好处,都适用于整个二进制文件,而不仅仅是每个对象。