ELF和PE文件的基本链接过程是如何工作的?

3

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

为了说明我的问题并为答案提供框架,我将记录我已经知道(或认为我已经知道)的内容。 我可能非常错误:)

首先,每个.cpp文件都会被编译成一个中间文件(Posix / ELF的.o文件和Win / PE的.obj文件)。 中间文件包含由它构建的.cpp定义的所有符号,并具有要正确解析外部链接所需的指令。 作为此扩展,Posix系统允许您将.o文件组合成.a文件(这似乎没有做更多的事情?哪个命令可以实现这个?)。 .lib是Win / PE等效于Posix .a文件吗?

接下来,所有的中间文件都会被链接在一起,解析外部依赖关系,然后就形成了可执行文件。 我漏掉了什么步骤吗?

谢谢!

1个回答

1

以下是谜题的几个部分:

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

很好,这回答了我所有的问题。谢谢! :) - Nayruden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接