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

为了证明我的问题并提供答案的框架,我将写下到目前为止我所知道的(或认为我知道的)内容。我可能错了。:)

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

接下来,将中间文件链接在一起,解决外部依赖关系,然后您就拥有了可执行文件。我是否缺少任何步骤?

谢谢!

有帮助吗?

解决方案

以下是这个谜题的几部分:

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