对《深入理解计算机系统》第七章 链接的读书随笔
对《深入理解计算机系统》第七章“链接”的学习随笔学习《深入理解计算机系统》第七章“链接”后我对程序从代码到可执行文件的最后一步关键流程有了清晰认知。链接本质上是由链接器负责将多个独立的代码段、数据段组合成一个可加载、可执行单元文件的过程是构造大型程序不可或缺的环节。理解链接的核心意义不仅能帮助我们高效构建大型程序将程序拆分多个模块独立开发、协同整合更能帮助我们规避编程中的危险错误搞清楚程序中作用域规则的底层实现逻辑掌握符号、库等核心概念进而灵活运用共享库优化程序性能、节省资源。链接构建可执行文件的核心流程分为两步符号解析与重定位。符号解析的核心是“找到对应关系”即明确每个模块所引用的符号如函数、全局变量的具体定义确定符号的类型及所属文件确保引用的符号都有唯一且合法的定义符号解析完成后进入重定位阶段通俗来讲就是确定所有解析后的符号、代码段、数据段在最终内存中的具体位置将符号引用与实际内存资源建立精准关联让程序能够正确找到所需的指令和数据。一、目标文件的分类与结构链接过程中涉及三种核心目标文件用途不同但文件格式高度一致可重定位文件即静态库的组成单元用于后续链接生成可执行文件或共享目标文件可执行文件链接的最终产物可直接被操作系统加载运行共享目标文件即动态库可在程序运行时被动态加载供多个程序共享使用。无论哪种目标文件均包含以下关键节段各司其职代码段存放编译后的机器指令是程序执行的核心只读段存放常量等不可修改的数据初始化数据段存放已初始化的全局变量和静态变量未初始化数据段存放未初始化的全局变量和静态变量程序加载时会被初始化为0符号表记录模块中定义和引用的函数、全局变量信息是符号解析的核心依据重定位表包含代码段、数据段中需要重定位的符号引用信息告知链接器如何修改这些引用调试表存放局部变量、类型定义、全局变量详情及源文件相关信息用于程序调试行号映射表建立源文件行号与机器指令的对应关系方便调试时定位代码字符串表存储符号名、文件名等字符串避免重复存储节省空间。二、符号表与符号解析一符号表的三种符号类型可输出的全局符号本模块定义供其他模块引用如全局函数、非静态全局变量被输入的全局符号本模块引用但由其他模块定义的符号如调用其他文件的函数无法输出的局部符号仅在本模块内部可见不可被其他模块引用如静态函数、静态变量。二符号解析规则符号解析的核心是为每个符号引用找到唯一的符号定义其中局部符号遵循“唯一定义”原则一个模块内不可出现同名局部符号全局符号的解析由链接器负责为解决全局符号多重定义问题链接器遵循以下三条核心规则禁止多个同名强符号已初始化的全局变量、函数共存否则链接报错若存在一个强符号和多个同名弱符号未初始化的全局变量优先选择强符号作为最终定义若存在多个同名弱符号链接器可任意选择其中一个作为最终定义。三、静态库及其链接过程静态库是多个可重定位目标文件的归档集合其核心价值在于“模块化整合、按需引用”——将多个相关函数模块整合为一个库文件链接时无需加载整个库仅提取程序所需的模块避免冗余代码节省磁盘空间。链接器使用静态库的核心流程围绕三个关键集合展开已合成文件集合E、未解析符号集合U、已定义符号集合D链接器先遍历命令行中的所有文件区分目标文件和静态库归档文件对于目标文件直接将其加入E集合同时更新U集合新增该文件的未解析符号和D集合新增该文件的已定义符号对于静态库仅提取其中能解析U集合中未解析符号的模块将这些模块加入E集合并更新U和D集合未被引用的模块不会被加载实现“按需引用”。四、重定位的核心流程与细节当符号解析完成、所有符号的定义均已确定后链接器进入重定位阶段。此时链接器已明确所有输入模块的大小和排列顺序核心任务是确定每个符号的最终内存地址并修正所有符号引用具体分为两步节合并将所有输入模块中相同类型的节如所有代码段、所有初始化数据段分别聚合形成可执行文件的对应节确定每个节的起始内存地址符号引用修正遍历每个节中的重定位条目按照条目指示的规则修改代码或数据中的符号引用使其指向节合并后的最终内存地址。一重定位条目由于编译器编译模块时无法预知该模块最终会被加载到内存的哪个位置也无法确定引用的外部符号的地址因此会为每个需要重定位的符号引用生成一个“重定位条目”用于告知链接器“该位置需要修改、修改的规则是什么”是重定位过程的核心依据。二重定位符号引用的两种类型相对引用符号引用的地址是相对于当前指令地址的偏移量重定位时仅需根据节的最终地址调整偏移量兼容性更强绝对引用符号引用直接指向符号的最终内存地址重定位时需将引用地址直接修改为符号的实际地址。五、动态链接共享库动态库动态库与静态库的核心区别在于“加载时机和共享机制”静态库在链接时会被复制嵌入到可执行文件中每个使用静态库的程序都会包含一份库代码容易造成内存和磁盘冗余而动态库不会在链接时嵌入可执行文件仅在程序加载或运行时由动态链接器加载到内存供多个进程共享使用极大节省了内存和磁盘资源。此外动态库的更新无需重新编译可执行文件仅需替换动态库文件即可提升了程序的维护效率是现代程序开发中常用的库形式。

相关新闻

(100分)- 等和子数组最小和(Java  JS  Python)

(100分)- 等和子数组最小和(Java JS Python)

(100分)- 等和子数组最小和(Java & JS & Python)题目描述给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。输入描述第一行输入 m 接着输入m个数…

2026/7/6 23:13:56 阅读更多 →
(100分)- 对称美学(Java  JS  Python)

(100分)- 对称美学(Java JS Python)

(100分)- 对称美学(Java & JS & Python) 题目描述 对称就是最大的美学,现有一道关于对称字符串的美学。已知: 第1个字符串:R第2个字符串:BR第3个字符串:RBBR第4个字符串:…

2026/7/6 12:56:55 阅读更多 →
(100分)- 端口合并(Java  JS  Python)

(100分)- 端口合并(Java JS Python)

(100分)- 端口合并&#xff08;Java & JS & Python&#xff09;题目描述有M个端口组(1<M<10)&#xff0c; 每个端口组是长度为N的整数数组(1<N<100)&#xff0c; 如果端口组间存在2个及以上不同端口相同&#xff0c;则认为这2个端口组互相关联&#xff0c;…

2026/7/6 22:29:02 阅读更多 →

最新新闻

C# 运动控制框架多线程实战:3种线程同步原语对比与ManualResetEvent应用

C# 运动控制框架多线程实战:3种线程同步原语对比与ManualResetEvent应用

C# 运动控制框架多线程实战&#xff1a;3种线程同步原语深度对比与ManualResetEvent工程实践引言&#xff1a;工业控制场景下的线程同步挑战在数控机床的G代码执行过程中&#xff0c;当急停按钮被触发时&#xff0c;系统需要在5毫秒内完成所有轴的制动——这个场景完美诠释了工…

2026/7/6 23:36:39 阅读更多 →
UE5 Control Rig 受击响应实战:2个控制器+Fullbody IK 实现8方向动态反馈

UE5 Control Rig 受击响应实战:2个控制器+Fullbody IK 实现8方向动态反馈

UE5 Control Rig 受击响应实战&#xff1a;2个控制器Fullbody IK 实现8方向动态反馈在角色动作游戏中&#xff0c;受击反馈是提升战斗沉浸感的关键要素。传统蒙太奇动画虽然简单直接&#xff0c;但面对360度攻击方向时往往显得生硬呆板。本文将带你用UE5的Control Rig系统&…

2026/7/6 23:34:38 阅读更多 →
偏微分方程数值解避坑指南:有限差分法3大稳定性条件与误差分析

偏微分方程数值解避坑指南:有限差分法3大稳定性条件与误差分析

有限差分法求解偏微分方程的3大稳定性陷阱与Python实战避坑指南1. 问题背景与核心挑战在工程计算与科学模拟中&#xff0c;有限差分法(FDM)因其直观性和易实现性&#xff0c;成为求解偏微分方程(PDE)的主流数值方法之一。然而&#xff0c;当处理一维平流方程这类典型问题时&…

2026/7/6 23:32:36 阅读更多 →
PaddleOCR PP-OCRv6 模型 CPU/GPU 推理对比:3 种环境下的速度与精度实测

PaddleOCR PP-OCRv6 模型 CPU/GPU 推理对比:3 种环境下的速度与精度实测

PaddleOCR PP-OCRv6 全场景性能实测&#xff1a;CPU/GPU/Docker 部署方案深度解析1. 开篇&#xff1a;为什么选择 PP-OCRv6&#xff1f;在数字化转型浪潮中&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为企业降本增效的利器。百度飞桨团队推出的 PP-OCRv6 作为…

2026/7/6 23:30:35 阅读更多 →
Windows 10/11 移动热点与第三方软件对比:5 项指标实测与 2 个典型错误排查

Windows 10/11 移动热点与第三方软件对比:5 项指标实测与 2 个典型错误排查

Windows热点与第三方工具深度评测&#xff1a;抓包环境搭建的5大核心指标与实战避坑指南当移动开发者需要调试App网络请求或安全工程师分析流量时&#xff0c;一个稳定的抓包环境如同外科医生的手术刀。本文将带您深入比较Windows原生热点与第三方工具在抓包场景下的真实表现&a…

2026/7/6 23:28:33 阅读更多 →
Unity 协程 IEnumerator 状态机解析:从 C# yield 到 IL2CPP 的 3 层转换

Unity 协程 IEnumerator 状态机解析:从 C# yield 到 IL2CPP 的 3 层转换

Unity 协程 IEnumerator 状态机解析&#xff1a;从 C# yield 到 IL2CPP 的 3 层转换当你在 Unity 中写下yield return null时&#xff0c;背后发生的魔法远比表面看起来复杂。这个简单的语句触发了从 C# 语法糖到 IL 中间语言&#xff0c;再到 IL2CPP 转换的三层技术栈转换。本…

2026/7/6 23:24:28 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻