{"name":"链接","id":"计算机系统-在系统上运行程序-链接","content":"# 链接\n\n## 一、链接的第一性原理（总纲）\n\n### 1.1 一个根本问题\n\n> **CPU 只理解地址，不理解名字。**\n\n而人类程序员编写程序时，只能使用：\n\n* 函数名\n* 变量名\n* 模块名\n\n**链接的本质任务**，就是在这两种世界之间建立一个一致、可维护、可演进的映射体系。\n\n### 1.2 链接的本质抽象\n\n> **链接 = 符号空间 → 地址空间 → 运行时内存空间 的映射与一致性维护**\n\n链接器始终围绕三件事工作：\n\n| 核心职责 | 抽象含义          |\n| ---- | ------------- |\n| 符号解析 | “这个名字指向谁？”    |\n| 地址分配 | “它最终放在哪里？”    |\n| 重定位  | “所有引用如何同步更新？” |\n\n后文中出现的 ELF、GOT、PLT、PIC、延迟绑定，\n**都只是这三件事在不同约束条件下的实现策略**。\n\n---\n\n## 二、从程序文本到可执行体：全局视角\n\n### 2.1 程序生命周期的稳定分层\n\n从系统视角看，一个 C 程序会经历以下**稳定阶段**：\n\n1. **文本阶段**：源代码（人类可读）\n2. **中间表示阶段**：汇编（架构相关）\n3. **目标文件阶段**：可重定位目标文件（局部一致性）\n4. **链接阶段**：全局一致性建立\n5. **加载阶段**：地址空间实例化\n6. **执行阶段**：CPU 按地址取指\n\n> **链接器存在的根本原因**：\n> 编译器只能保证“单个编译单元内”的正确性，\n> 而系统需要的是“整个程序”的一致性。\n\n---\n\n## 三、链接器的核心工作模型\n\n### 3.1 两遍扫描模型（稳定抽象）\n\n无论是静态链接还是动态链接，链接器都遵循一个高度稳定的模型：\n\n#### 第一遍：收集信息（建立全局视图）\n\n* 扫描所有输入目标文件\n* 合并相同类型的段（Section）\n* 收集符号定义与符号引用\n* 构建**全局符号表**\n* 为每个符号分配虚拟地址\n\n#### 第二遍：修正引用（维持一致性）\n\n* 遍历所有符号引用点\n* 根据符号表进行地址替换\n* 完成重定位\n\n> **一句话总结**：\n> 第一遍“决定世界长什么样”，第二遍“让所有人达成共识”。\n\n---\n\n## 四、目标文件：链接器的工作对象\n\n### 4.1 目标文件的三种稳定形态\n\n| 类型            | 抽象角色  |\n| ------------- | ----- |\n| 可重定位目标文件 (.o) | 局部世界  |\n| 可执行目标文件       | 完整世界  |\n| 共享目标文件 (.so)  | 可复用世界 |\n\n### 4.2 Section 与 Segment 的抽象分工\n\n* **Section（节）**：\n\n  * 面向链接器\n  * 逻辑组织单位（.text / .data / .bss）\n\n* **Segment（段）**：\n\n  * 面向加载器\n  * 运行时内存映射单位\n\n> **同一个 ELF 文件，同时服务于两个视角**：\n>\n> * 链接视角（Section）\n> * 执行视角（Segment）\n\n---\n\n## 五、符号：名字如何变成地址\n\n### 5.1 符号的稳定分类\n\n* 全局符号：跨文件可见\n* 外部符号：引用但未定义\n* 局部符号：文件内部使用\n\n### 5.2 符号解析的核心规则\n\n* 强符号不能重名\n* 强符号优先于弱符号\n* 多个弱符号允许存在\n\n> **本质目标**：在存在歧义时，维持系统的确定性。\n\n---\n\n## 六、重定位：一致性如何被维护\n\n### 6.1 为什么需要重定位\n\n编译阶段：\n\n* 编译器不知道最终地址\n* 所有跨文件引用只能“占位”\n\n链接阶段：\n\n* 链接器确定最终布局\n* 必须同步修正所有引用\n\n### 6.2 重定位的抽象公式\n\n> **最终地址 = 符号地址 + 修正量 − 引用位置**\n\n这一定义与具体架构无关，是一种**地址一致性约束**。\n\n---\n\n## 七、静态链接：一次性解决问题\n\n### 7.1 定义\n\n> **静态链接**：在程序生成时，完成所有符号解析与重定位。\n\n### 7.2 特点（系统视角）\n\n* 启动快\n* 独立完整\n* 内存无法共享\n* 升级与安全成本高\n\n> 静态链接追求的是**确定性与封闭性**。\n\n---\n\n## 八、动态链接：将问题推迟\n\n### 8.1 动态链接的核心思想\n\n> **不是不链接，而是“晚一点再链接”。**\n\n链接被拆分为：\n\n* 编译期：记录“依赖关系”\n* 加载期 / 运行期：完成最终绑定\n\n### 8.2 动态链接成立的前提\n\n* 虚拟内存\n* 地址空间隔离\n* 共享代码段\n\n---\n\n## 九、PIC / GOT / PLT：为不确定性而生\n\n### 9.1 不确定性的来源\n\n* 共享库加载地址不固定\n* 不同进程虚拟地址不同\n* ASLR 引入随机性\n\n### 9.2 位置无关代码（PIC）\n\n> **可以在任意地址执行而无需修改的代码。**\n\n核心策略：\n\n* 内部引用：相对偏移\n* 外部引用：间接寻址\n\n### 9.3 GOT 与 PLT 的分工\n\n| 机制  | 抽象角色     |\n| --- | -------- |\n| GOT | 地址表（数据）  |\n| PLT | 跳转入口（控制） |\n\n---\n\n## 十、延迟绑定：性能与灵活性的权衡\n\n### 10.1 动机\n\n* 避免启动时解析全部符号\n* 降低冷启动成本\n\n### 10.2 本质机制\n\n> **第一次调用时解析，之后直接使用结果。**\n\n通过运行时修改 GOT 实现。\n\n---\n\n## 十一、加载与运行：链接的终点\n\n### 11.1 加载器的职责\n\n* 创建进程虚拟地址空间\n* 映射可执行文件与共享库\n* 启动动态链接器\n\n### 11.2 最终状态\n\n> 在 CPU 看来：\n> 一切都是**已经解析好的内存地址**。\n\n---\n\n## 十二、系统级总结（稳定认知）\n\n1. 链接是编译系统中**最后一个全局视角阶段**\n2. 符号解析、地址分配、重定位是永恒三要素\n3. ELF 同时服务链接视角与执行视角\n4. 动态链接本质是\"推迟一致性建立\"\n5. PIC 是动态链接与 ASLR 的基础\n6. 虚拟内存是现代链接机制的根基\n7. 所有复杂性，都是为了在不确定性中维持秩序\n\n## 关联内容（自动生成）\n\n- [/计算机系统/在系统上运行程序/异常控制流.md](/计算机系统/在系统上运行程序/异常控制流.md) 链接过程与异常控制流在系统级执行模型中密切相关，特别是在处理动态链接和运行时符号解析时涉及异常处理机制\n- [/操作系统/内存管理.md](/操作系统/内存管理.md) 内存管理与链接过程密切相关，特别是重定位和虚拟内存的概念，是理解链接机制的重要基础\n- [/编程语言/C.md](/编程语言/C.md) C语言的编译和链接过程是理解链接机制的重要实践基础，其中详细介绍了链接相关的概念\n- [/编程语言/C++.md](/编程语言/C++.md) C++的链接特性（如符号解析）比C语言更复杂，是深入理解链接机制的重要参考\n- [/操作系统/linux/内核.md](/操作系统/linux/内核.md) Linux内核支持链接与共享，了解内核层面的实现有助于理解链接机制\n- [/操作系统/linux/Linux性能优化.md](/操作系统/linux/Linux性能优化.md) 动态链接库相关的性能优化，与链接过程密切相关\n","metadata":"tags: ['编程语言']","hasMoreCommit":true,"totalCommits":14,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-12T16:16:47+08:00","author":"MY","message":"feat(doc): 添加计算机系统链接章节图片资源并重构文档内容","hash":"c48902c155bfc42fb13fb7e7ce06a8303d0724c9"},{"date":"2024-12-02T19:28:47+08:00","author":"MY","message":"📦计算机系统","hash":"120847197a4799fd4df9146d1579b956be153cae"},{"date":"2024-03-04T18:51:23+08:00","author":"MY","message":"✏链接","hash":"68ad351b7c35df0f7af3a65b94a6ec703c692c1e"},{"date":"2024-03-01T19:51:24+08:00","author":"MY","message":"✏链接","hash":"136fe197449b769f36be81d9fd30f3fd4115aabd"},{"date":"2023-03-09T09:41:00+00:00","author":"My","message":"🛠替换在线图片","hash":"0c8b08bc22fbe482ba02da2f1fcad211441d3c23"},{"date":"2022-10-20T20:33:01+08:00","author":"cjiping","message":"✏️内核","hash":"29831f7800f96fb03d4b3658f55c2caa5424811f"},{"date":"2022-06-22T21:41:04+08:00","author":"MY","message":"✏️更新 链接","hash":"f598c3a78e7db36db9cbe42fc9e57628cc921305"},{"date":"2020-03-02T19:22:07+08:00","author":"MY","message":"计算机系统 更新链接","hash":"d0a7e2bd3e896a5f08f78bca31d27e6bf723e448"},{"date":"2019-07-15T10:59:02+08:00","author":"My、","message":"20190715","hash":"1f3f5c1cdf18eb1eae8ca3f0cee4bc0fb8788a31"}],"createTime":"2019-07-11T21:41:49+08:00"}