3

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

为了演示我的问题并为答案提供框架,我将写下到目前为止我所知道的(或认为我知道的)。我可能是非常错误的。:)

首先,每个 .cpp 文件都被构建到一个中间文件中(我相信 .o 代表 Posix/ELF 和 .obj 代表 Win/PE)。该中间文件包含由它构建的 .cpp 定义的所有符号,并说明了需要正确解析哪些外部链接。作为对此的扩展,Posix 系统允许您将 .o 文件合并到 .a 文件中(这似乎除了合并之外没有任何作用?这是什么命令?)。.lib 是 Posix .a 文件的 Win/PE 等价物吗?

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

谢谢!

4

1 回答 1

1

这里有几个拼图:

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