详解源文件编译链接至可执行程序的每一步
前言
本文利用C语言介绍源文件是如何一步一步地编译、链接成为可执行程序的。
(相关资料图)
一、编译链接总述
编译链接本身分为许多个过程,但从整体上可以概括为以下三点:
程序的每个源文件分别
通过编译器的编译,生成对应的目标文件。每个目标文件通过链接器链接在一起,形成一个独立单一而完整
的可执行文件。链接时会在链接库内搜索C标准库及程序员个人函数库
中的函数,并将其链接至可执行程序。整体过程如下图所示:
二、编译过程
阶段I 预处理
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定义等。
经过预处理后的文件后缀会变为i
,文件以i
为后缀代表其已经过预处理,但未进行下一阶段的编译。
1)头文件的包含
在我们写代码时,包含头文件的是必不可少的,而在预处理中:包含头文件的操作等同于拷贝头文件中的代码,随后将源文件中的代码和头文件中的代码一起放入后缀为i
的文件中。
预处理前:
预处理后:
相当于将头文件中的代码拷贝至源文件的头部,同时删掉#include"head.h"
其效果与下面的代码相同,此时的文件后缀为i
。
struct MyStruct{int a;int b;};int main(){struct MyStruct s;return 0;}
2)宏定义的替换
在预处理时,源文件中宏定义内容会在i
文件中被直接替换。
预处理前:
#include#define MAX 100int main(){int a = MAX;printf("%d\n", a);return 0;}
预处理后:
预处理后MAX
会被直接替换为100
,同时删除前面的#define MAX 100
,其效果与下图代码相同。
3)注释的删除
在预处理时,编译器还会删除//
后面的内容以及被/* */
包括起来的内容,以便于接下来的编译阶段。
如图:
4)阶段总结
可以看到,不管是头文件、宏定义、还是注释,都是编译器对文本
的操作。
因此可以说:预处理阶段是编译器对文本的操作阶段。
阶段II 编译
当源文件经过预处理后,便开始第二个阶段——编译,经过编译的文件的后缀将变成s
,文件后缀为s
代表其已经经过第二阶段的编译,但未进行汇编操作。
编译阶段会将C语言代码进行语法分析
、词法分析
、词义分析
,以及符号汇总
。
1)主要操作
语法分析:检测是否有语法错误,检测语法格式是否正确等。词法分析:拆解语句或字符为关键字等。语义分析:翻译每条语句或关键字的意义。符号汇总:将代码中涉及的符号进行汇总,以便于在汇编阶段中形成符号表。2)阶段总结
编译阶段从整体上看是对C语言代码进行分析解读
由于该阶段涉及编译的原理,因此只了解大概即可,详见书籍《编译原理》。
阶段III 汇编
当源文件经过第一、二阶段后,便开始第三个阶段——汇编,经过汇编的文件的后缀将变成o或obj
,即开头所说的目标文件
,文件后缀为o或obj
代表其至少已经经过三个阶段的编译。
PS:在VS环境下生成的目标文件后缀为obj
,在GCC环境下生成的目标文件后缀为o
。
1)主要操作
将汇编代码翻译成二进制指令。形成符号表。2)符号表详解
在第二阶段的编译中会将代码中的全局变量
,函数名
等汇总,并在汇编阶段形成类似一张表格。
收集以下代码中的全局变量与函数名:
形成表格:
符号表的详细作用在链接时详细介绍。
名 | 址 | ... |
---|---|---|
val | 0X0012FF40 | |
add | 0X0012FF80 | |
main | 0X0012FF20 |
三、链接过程
链接主要包括合并段表
、符号表的合并及重定位
两大过程。
下面依次介绍。
I 合并段表
在源文件经过编译过程后文件后缀变为o
或obj
后,其内部的代码已经变成二进制。
此时,文件会将内部的二进制代码按类型
划分成许多部分,每一部分就被称为一段。
如图:
前文我们说到,多个目标文件经过链接器后整合为一个独立而完整的文件,因此链接中合并段表的意思就是把多个目标文件中对应的段,合并在一个目标文件内。
II 符号表的合并
顾名思义,将每个目标文件中的符号表合并成一个目标文件的符号表。
III 符号表的重定位
如果在写代码时发生函数定、声明、使用等不在同一源文件等情况,那么多个目标文件的符号表中可能都会有相同的函数名及无效的地址,像这样:
如上图,在两个文件中都有add的存在,那么,在head.obj
和源.obj
的符号表中都会有收录add。
但因源.c
中没有对add进行实现,因此在汇总源.c
的符号表时,其地址会被填入一个无效的地址。
在链接过程中,链接器不仅会对符号表合并,也会将多余的符号删除,同时将每个符号的地址都定位为所有地址中有效的那一个。
IIII 找不到符号报错
如果在写代码时不小心将函数名写错了,像这样:
那么由于在head.h
汇总符号表时找不到代码实现,就会把Add
的地址赋为一个无效的地址,像这样:
名 | 址 |
---|---|
Add | 0X00000000 |
add | 0X0012FF40 |
但是,在符号表的重定位时,也没有重定位Add的有效地址,那么链接就无法完成,就会报出典型的错误:
PS:函数声明extern
的作用就是告诉编译器,遇到无法解释的符号先别急着报错,后面会有定义的。
四、全文总结
多个源文件经过预处理(头文件包含、宏定义替换、注释的删除),编译(语法分析、词法分析、词义分析、符号汇总),汇编(二进制指令翻译、形成符号表)后成为一个目标文件。
多个目标文件在链接库的帮助下完成合并段表,符号表合并,符号表重定位后整合为一个目标文件。
到最后变成一个可执行的exe文件。
感谢您的阅读与耐心~
-
2023-02-13 20:03:08
详解源文件编译链接至可执行程序的每一步<
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定
-
2023-02-13 18:00:16
每日播报!美国解说员将乌克兰中场误说为俄罗斯人,球员妻子怒喷:耻辱<
美国解说员将乌克兰中场误说为俄罗斯人,球员妻子怒喷:耻辱,马赛,俄罗斯,乌克兰,莫斯科,美国解说员,马利诺夫斯基
-
2023-02-13 16:40:38
【时快讯】管理_关于管理介绍<
1、管理是指一定组织中的管理者,通过实施计划、组织、领导、协调、控制等职能来协调他人的活动,使别人同自己一起实现既定
-
2023-02-13 14:58:19
凉州大马缘何横行天下?|报道<
在大多数人的印象里,武威的形象总是伴随着大漠风沙、金戈铁马。她是大汉的“武功军威”,是盛唐《凉州词》里的“醉卧沙场君莫笑,古来征战...
-
2023-02-13 12:47:29
每日速看!创“五联品牌” 树“平安之路”<
央广网佳木斯2月13日消息(记者马俊玮通讯员李明轩)平安乡位于佳木斯市区北部,西部与莲江口镇、莲江口农场接壤,北部隔阿凌达河与汤原县吉祥
-
2023-02-13 20:03:08
详解源文件编译链接至可执行程序的每一步
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定
-
2023-02-13 18:00:16
每日播报!美国解说员将乌克兰中场误说为俄罗斯人,球员妻子怒喷:耻辱
美国解说员将乌克兰中场误说为俄罗斯人,球员妻子怒喷:耻辱,马赛,俄罗斯,乌克兰,莫斯科,美国解说员,马利诺夫斯基
-
2023-02-13 16:40:38
【时快讯】管理_关于管理介绍
1、管理是指一定组织中的管理者,通过实施计划、组织、领导、协调、控制等职能来协调他人的活动,使别人同自己一起实现既定
-
2023-02-13 14:58:19
凉州大马缘何横行天下?|报道
在大多数人的印象里,武威的形象总是伴随着大漠风沙、金戈铁马。她是大汉的“武功军威”,是盛唐《凉州词》里的“醉卧沙场君莫笑,古来征战...
-
2023-02-13 12:47:29
每日速看!创“五联品牌” 树“平安之路”
央广网佳木斯2月13日消息(记者马俊玮通讯员李明轩)平安乡位于佳木斯市区北部,西部与莲江口镇、莲江口农场接壤,北部隔阿凌达河与汤原县吉祥
-
2023-02-13 11:05:11
今日聚焦!第十六届中国·宜宾早茶节在四川筠连举行 现场销售茶叶2.3亿元
第十六届中国·宜宾早茶节在四川筠连举行现场销售茶叶2 3亿元2月12日,四川省宜宾市筠连县巡司镇银星村八一茶山正式开园,这也标志着2023年第
-
2023-02-13 09:25:05
给老人送什么礼物好|通讯
送什么礼物好。首先要考虑老人的兴趣爱好,兴趣等,然后根据他的兴趣去选择礼物。这也会让老人更加开心。送礼物最好是送健康,比
-
2023-02-13 08:55:05
好吃不过饺子下一句是什么_好吃不过饺子下一句解释
欢迎观看本篇文章,小升来为大家解答以上问题。好吃不过饺子下一句是什么,好吃不过饺子下一句解释很多人还不知道,现在让我们一
-
2023-02-12 12:04:04
关于宇宙的资料_有关于宇宙的资料|世界今亮点
1、有关于宇宙的资料:宇宙有多大? 20年代,天文学家艾支哈勃发现,宇宙原来是以恒速扩张的。2、宇宙中的星体犹如气
-
2023-02-12 08:56:57
肩周炎宁康贴的作用_肩周炎宁康贴
1、对的,是中医膏药,很有效。2、我哥哥因为工作的原因的了这个病,肩周炎对他们来说算职业病吧。3、一开始疼的时候就吃止痛的药物,也拔罐。4
-
2023-02-12 05:14:47
生日礼物送什么好给女生|全球新资讯
女生过生日送什么礼物好?我认识的一个女生,是个很好的同学,关系一直很好,她快过生日了,邀请我参加生日派对,我送她什么生日
-
2023-02-12 00:46:45
设置虚拟内存对电脑有什么危害_设置虚拟内存对电脑有什么危害
1、设置大容量的虚拟内存,对电脑和硬盘没有任何伤害,只是浪费硬盘空间罢了。2、一个很常见的误解,就是设置大的虚拟内存可以
-
2023-02-11 20:59:25
脚裂口子最有效的偏方_脚裂口子怎么办_全球新资讯
1、病情分析:足皲裂的原因很多,根据不同的原因需要不同的治疗方法:1。2、单纯性皲裂足每晚用温水浸泡软化角质层,然后外用
-
2023-02-11 17:46:10
比亚迪海鸥最新实拍,外观时尚动感,或7万起售,又是爆款?
随着微型电动车市场的火爆,越来越多的车企纷纷开始布局抢市场,前有奇瑞、长安、吉利,如今就连比亚迪也忍不住出手了。当然了,其实这也并不
-
2023-02-11 14:47:48
天天关注:应健中:新规落地后多空博弈会更热闹
应健中:新规落地后多空博弈会更热闹本文共1168字阅读完约3分钟将定价权交给市场,带来的是市场化程度越来越高,市场震荡空间越来越大 时间不
-
2023-02-11 11:02:52
【文化】贵州凯里:笙歌苗舞喜迎春_热推荐
【文化】贵州凯里:笙歌苗舞喜迎春
-
2023-02-11 08:54:44
前恒大主帅被解雇,在中国执教仅仅五个月,却赚走五个亿 世界讯息
这两天咱们还在讨论有关于中国男子足球国家队如何选出新任主教练一事,因为来不及从国外去仔细筛选国外教练。现在只能从国内的俱乐部或者中超
-
2023-02-11 05:37:42
一加两款折叠屏手机曝光,平板要给OPPO让路?_快看点
一加两款折叠屏手机曝光,平板要给OPPO让路?
-
2023-02-11 01:19:28
医院看人送什么花合适
医院看人送这些花合适,康乃馨,表示对老人健康的祝福,也可以的,送康乃馨也可以的,祝老人早日康复,康复。康乃馨:母爱、魅力
-
2023-02-11 01:07:25
淘宝双12有折扣吗?有购物津贴领取吗?|环球今热点
大家刚刚享受过淘宝双十一的折扣活动,相信也都囤了很多货了,最近有小伙伴想知道淘宝双12有折扣吗?那么接下来,我们就来给大家讲解一下这方面
-
2023-02-10 22:12:05
由于后面的关联词_由于后面接什么关联词
1、关联词“由于”搭配有:因为(由于) 所以 (之所以 是由于 )。2、“由
-
2023-02-10 21:48:03
哈尔滨到北京火车时刻表查询_哈尔滨到北京火车
1、车次发车—到达发时—到时车型运行时间里程参考票价1302哈尔滨-北京02:51-当天21:27慢车18小时36分1401公
-
2023-02-10 19:57:17
怎么样把自己绑起来难受又解不开_男人硬起来的时候是不是很难受 世界微速讯
1、男人硬起来的时候,是很难受的。2、如果男性硬了就不,往往会导致精液堆积在生殖道内,导致小腹不适,出现局部点火发热的症
-
2023-02-10 18:05:02
要闻:第一次怎么样才不疼_第一次怎么样可以不痛
1、由于处女膜的厚度和韧性以及每个女性对疼痛的敏感程度不同,处女膜破裂带来的疼痛也大不相同。2、有的处女膜比较薄,破裂时
-
2023-02-10 17:53:09
焦点短讯!罗杰斯:我给孩子留大量中国股票
关于最近【罗杰斯:我给孩子留大量中国股票】事件在百度搜索的热度非常高,关注要排名的很多网友同样也在关注【罗杰斯:我给孩子留大量中国股
-
2023-02-10 16:07:07
酒后驾驶电动车,交警:罚!
酒后驾驶电动车,交警:罚!
-
2023-02-10 14:43:44
光大证券:金融服务需求改善确定性较强 零售银行或迎来多重利好 当前观察
智通财经APP获悉,光大证券发布研究报告称,在经济逐步回暖过程中,“宽信用”具有延续性,持续超预期的信用扩张和政策维稳将带动银行板块...
-
2023-02-10 12:44:28
功夫斧头帮老大谁演的
功夫斧头帮老大谁演的,功夫斧头帮老大是陈国坤演的,因貌似李小龙而被大家赏识,原为电影配乐及编舞的等电影幕后工作人员,曾客串过古惑仔,
-
2023-02-10 12:37:20
胫骨前肌_说一说胫骨前肌的简介 世界热文
夏弥来为大家解答以下的问题,胫骨前肌,说一说胫骨前肌的简介,现在让我们一起来看看吧!1、胫骨前肌:系小腿前群肌之一。2、
-
2023-02-10 11:03:40
郑州47中全称_郑州47中官网 世界焦点
1、往日风雨兼程,终于硕果累累!在2004年的中招考试中,我校的朱青同学以总分561分的成绩摘取了“郑州市中招
-
特写:风吹稻香忆袁老——袁隆平逝世一周年的墓前追思
2022-05-23 16:13:29 -
北京5月21日区域核酸筛查初筛10管混采阳性
2022-05-23 16:13:29 -
北京两地由高风险降为中风险 一地降为低风险地区
2022-05-23 16:13:29 -
5月21日15时至22日15时,北京新增本土新冠肺炎病毒感染者94例
2022-05-23 16:13:29 -
108岁病人顺利出院,瑞金医院卢湾分院已收治10位百岁老人
2022-05-23 16:13:29 -
生态花园助力乡村振兴 重庆小山村展现“乡土美学”
2022-05-23 16:13:29 -
上海金山政务服务场所逐步恢复服务
2022-05-23 16:13:29