基本链接过程如何为ELF和PE工作

时间:2008-12-03 16:05:18

标签: object linker elf portable-executable

我一直对链接器的工作原理感到困惑,这是一个难以搜索的主题。

为了证明我的问题并提供答案的框架,我将在目前为止记下我所知道的(或者我认为我知道的)。我可能是非常错的。 :)

首先,每个.cpp文件都内置在一个中间文件中(.o用于Posix / ELF,而.obj用于Win / PE我相信)。此中间文件包含由其构建的.cpp定义的所有符号,并具有正确解析所需外部链接的说明。作为对此的扩展,Posix系统允许您将.o文件合并到一个.a文件中(除了组合之外似乎什么都不做?这是什么命令?)。 .lib是Posix .a文件的Win / PE等价物吗?

接下来,将中间文件链接在一起,解析外部依赖项,并获得可执行文件。我错过了任何步骤吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是一些难题:

  • ar(1)用于创建.a文件。它们类似于tar(1)或zip文件(可能 使用索引按符号名称查找目标文件)
  • 链接器将目标文件(文本,数据,bss)的各个部分复制在一起。对于GNU ld,可以使用链接描述文件控制部分的精确复制(例如,将名称中包含“text”的.o文件中的所有部分复制到单个文本部分中)
  • 链接器也进行重定位:一旦知道符号的值,就用各自的目标地址修补指令(跳转和数据加载)。在某些情况下,这不能在链接时完成,因此链接器会将.o文件中的重定位记录复制/调整为最终的可执行文件。
  • windows .lib有两个用途:静态库(.lib)类似于.a库。导入库(.lib)不包含实际代码,只包含符号列表。链接器可以解析导入库中的符号,但后来知道它需要将对应的.dll的引用放入可执行文件中。在Unix / ELF上,.so文件包含代码和符号表。