登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
安全
›
对《深入理解计算机系统》第七章 链接的读书随笔 ...
对《深入理解计算机系统》第七章 链接的读书随笔
[ 复制链接 ]
忆雏闲
2026-2-8 21:50:00
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
对《深入理解计算机系统》第七章“链接”的学习随笔
学习《深入理解计算机系统》第七章“链接”后,我对程序从代码到可执行文件的最后一步关键流程有了清晰认知。链接本质上是由链接器负责,将多个独立的代码段、数据段组合成一个可加载、可执行单元文件的过程,是构造大型程序不可或缺的环节。
理解链接的核心意义,不仅能帮助我们高效构建大型程序(将程序拆分多个模块独立开发、协同整合),更能帮助我们规避编程中的危险错误,搞清楚程序中作用域规则的底层实现逻辑,掌握符号、库等核心概念,进而灵活运用共享库优化程序性能、节省资源。
链接构建可执行文件的核心流程分为两步:符号解析与重定位。符号解析的核心是“找到对应关系”,即明确每个模块所引用的符号(如函数、全局变量)的具体定义,确定符号的类型及所属文件,确保引用的符号都有唯一且合法的定义;符号解析完成后,进入重定位阶段,通俗来讲,就是确定所有解析后的符号、代码段、数据段在最终内存中的具体位置,将符号引用与实际内存资源建立精准关联,让程序能够正确找到所需的指令和数据。
一、目标文件的分类与结构
链接过程中涉及三种核心目标文件,用途不同但文件格式高度一致:
可重定位文件:即静态库的组成单元,用于后续链接生成可执行文件或共享目标文件;
可执行文件:链接的最终产物,可直接被操作系统加载运行;
共享目标文件:即动态库,可在程序运行时被动态加载,供多个程序共享使用。
无论哪种目标文件,均包含以下关键节(段),各司其职:
代码段:存放编译后的机器指令,是程序执行的核心;
只读段:存放常量等不可修改的数据;
初始化数据段:存放已初始化的全局变量和静态变量;
未初始化数据段:存放未初始化的全局变量和静态变量(程序加载时会被初始化为0);
符号表:记录模块中定义和引用的函数、全局变量信息,是符号解析的核心依据;
重定位表:包含代码段、数据段中需要重定位的符号引用信息,告知链接器如何修改这些引用;
调试表:存放局部变量、类型定义、全局变量详情及源文件相关信息,用于程序调试;
行号映射表:建立源文件行号与机器指令的对应关系,方便调试时定位代码;
字符串表:存储符号名、文件名等字符串,避免重复存储,节省空间。
二、符号表与符号解析
(一)符号表的三种符号类型
可输出的全局符号:本模块定义,供其他模块引用(如全局函数、非静态全局变量);
被输入的全局符号:本模块引用,但由其他模块定义的符号(如调用其他文件的函数);
无法输出的局部符号:仅在本模块内部可见,不可被其他模块引用(如静态函数、静态变量)。
(二)符号解析规则
符号解析的核心是为每个符号引用找到唯一的符号定义,其中局部符号遵循“唯一定义”原则,一个模块内不可出现同名局部符号;全局符号的解析由链接器负责,为解决全局符号多重定义问题,链接器遵循以下三条核心规则:
禁止多个同名强符号(已初始化的全局变量、函数)共存,否则链接报错;
若存在一个强符号和多个同名弱符号(未初始化的全局变量),优先选择强符号作为最终定义;
若存在多个同名弱符号,链接器可任意选择其中一个作为最终定义。
三、静态库及其链接过程
静态库是多个可重定位目标文件的归档集合,其核心价值在于“模块化整合、按需引用”——将多个相关函数模块整合为一个库文件,链接时无需加载整个库,仅提取程序所需的模块,避免冗余代码,节省磁盘空间。
链接器使用静态库的核心流程,围绕三个关键集合展开(已合成文件集合E、未解析符号集合U、已定义符号集合D):
链接器先遍历命令行中的所有文件,区分目标文件和静态库归档文件;
对于目标文件,直接将其加入E集合,同时更新U集合(新增该文件的未解析符号)和D集合(新增该文件的已定义符号);
对于静态库,仅提取其中能解析U集合中未解析符号的模块,将这些模块加入E集合,并更新U和D集合;未被引用的模块不会被加载,实现“按需引用”。
四、重定位的核心流程与细节
当符号解析完成、所有符号的定义均已确定后,链接器进入重定位阶段。此时链接器已明确所有输入模块的大小和排列顺序,核心任务是确定每个符号的最终内存地址,并修正所有符号引用,具体分为两步:
节合并:将所有输入模块中相同类型的节(如所有代码段、所有初始化数据段)分别聚合,形成可执行文件的对应节,确定每个节的起始内存地址;
符号引用修正:遍历每个节中的重定位条目,按照条目指示的规则,修改代码或数据中的符号引用,使其指向节合并后的最终内存地址。
(一)重定位条目
由于编译器编译模块时,无法预知该模块最终会被加载到内存的哪个位置,也无法确定引用的外部符号的地址,因此会为每个需要重定位的符号引用生成一个“重定位条目”,用于告知链接器“该位置需要修改、修改的规则是什么”,是重定位过程的核心依据。
(二)重定位符号引用的两种类型
相对引用:符号引用的地址是相对于当前指令地址的偏移量,重定位时仅需根据节的最终地址调整偏移量,兼容性更强;
绝对引用:符号引用直接指向符号的最终内存地址,重定位时需将引用地址直接修改为符号的实际地址。
五、动态链接共享库(动态库)
动态库与静态库的核心区别在于“加载时机和共享机制”:静态库在链接时会被复制嵌入到可执行文件中,每个使用静态库的程序都会包含一份库代码,容易造成内存和磁盘冗余;而动态库不会在链接时嵌入可执行文件,仅在程序加载或运行时,由动态链接器加载到内存,供多个进程共享使用,极大节省了内存和磁盘资源。
此外,动态库的更新无需重新编译可执行文件,仅需替换动态库文件即可,提升了程序的维护效率,是现代程序开发中常用的库形式。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
深入
理解
计算机
系统
第七
相关帖子
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
AI 时代,计算机专业学生该怎么学?
多租户下的系统业务开发过程探讨
FAT32文件系统
FAT32文件系统
FAT32文件系统
实时行情系统设计:从协议选择到高可用架构,再到数据源选型
Golang sync.Map 深入探究
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
0
169
巨耗
2026-03-27
业界
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
0
172
阎怀慕
2026-03-27
业界
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能
0
793
敕码
2026-03-27
业界
AI 时代,计算机专业学生该怎么学?
0
608
即息极
2026-03-27
业界
多租户下的系统业务开发过程探讨
0
663
桂册
2026-03-27
安全
FAT32文件系统
0
976
科元料
2026-03-27
安全
FAT32文件系统
0
175
锟及
2026-03-27
安全
FAT32文件系统
0
279
睁扼妤
2026-03-27
业界
实时行情系统设计:从协议选择到高可用架构,再到数据源选型
0
400
呼延冰枫
2026-03-31
安全
Golang sync.Map 深入探究
0
935
吕梓美
2026-03-31
回复
(10)
厂潺
2026-2-9 16:10:14
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
东西不错很实用谢谢分享
百谖夷
2026-2-10 20:34:15
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
涣爹卮
2026-2-11 01:27:47
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
宿遘稠
2026-2-11 03:51:50
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
边书仪
2026-2-13 13:39:32
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
蝌棚煌
2026-2-20 00:12:00
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢,下载保存了
思矿戳
2026-2-26 07:16:47
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享
别萧玉
2026-3-2 15:07:13
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
过来提前占个楼
胥望雅
2026-3-8 10:19:28
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
茅香馨
2026-3-11 11:42:36
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
业界
签约作者
程序园优秀签约作者
发帖
忆雏闲
2026-3-11 11:42:36
关注
0
粉丝关注
19
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9524
6
韶又彤
9916
7
宋子
9882
8
荪俗
9020
9
闰咄阅
9999
10
刎唇
9999
查看更多
今日好文热榜
3
host怎么设置,host设置教程
934
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
3
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究
4
Golang sync.Map 深入探究
4
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究
4
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究
2
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究
1
Golang sync.Map 深入探究