详解源文件编译链接至可执行程序的每一步
前言
本文利用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文件。
感谢您的阅读与耐心~
相关文章
详解源文件编译链接至可执行程序的每一步
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定
【情感小故事分享】偷偷喜欢了她大半年,还是放弃了 今日讯
男生小张今年28岁,自去年年中入职某公司与姑娘小齐成了同事。当时,通过简单交流,小张发现,当初通知他进行第二轮面试的人正是小齐,哪怕时
京东特价版推广话术分享,京东推广文案怎么写? 天天快报
京东平台有推出京东特价版,使用京东特价版的时候,可以利用这个平台来大多引流推广的目的,而且还可以获取佣金,如果做推广的话需要掌握一些
机械设计制造及自动化高校排名_机械设计制造及其自动化考研院校排名
1、科目及分数如下所示:思想政治理论101分2、英语一201分3、是数学一301分4、专业课由学校划定一般来说可以考机
三星1510打印机驱动_三星1510
现在社会上各种各样的行业都有,但是随着社会的进步和发展,市场上出现了很多公司,所以为我们所有人提供了工作岗位,很多人可以坐办公室。大
【环球聚看点】厨师技能被及时挖掘:云南小伙李祥福来沪就业又多了一个选择
2023年2月9日上午,来自云南的务工者李祥福由徐汇区人社局工作人员带到厨房,测试厨艺。两天前,云南省红河州元阳县沙拉托乡82名劳动者,搭乘
极氪再推纯电SUV,3秒级破百,20万起售,能否再度成为车界黑马?
面对消费者需求的多样化,一个新势力品牌是否成功,一是要看其整体的销量表现,另外还要看其产品矩阵是否完备,极氪在推出猎装ZEEKR001和MPV车
软文广告经典案例300?企业如何做新闻推广容易被百度收录?
软文广告经典案例300?企业如何做新闻推广容易被百度收录?对于新闻推广,我们都知道可以提高企业品牌形象和企业知名度,现在无论哪个企业或多或少
共青森林公园迎春花初绽 金灿灿一片吹响春天号角_全球观焦点
东方网记者柏可林2月10日摄影报道:早春二月,共青森林公园一朵朵明亮的黄色小花如同精灵一般明媚地绽放,仿佛告诉着人们:“春天要来了!...
军队背景耽美小说 天天速递
军队背景耽美小说,1、《S间谍迷情》作者:英田沙希;2、《人间兵器》作者:红河;3、《谍变》作者:黯然销魂;4、《星际间谍》作者:黯然销魂
中二的名字网名_中二的名字 焦点消息
1、优雅旳面具╮2、smile灬凉城丶3、从来没有命定的不幸≈4、┽→怎麽忘记你﹏ 5、你。2、不配6、没人比我更行7、
焦点信息:王者兵线刷新时间表快速记忆_王者兵线刷新时间表
1、王者荣耀兵线时间刷新表兵线刷新时间无变化,约为33秒。2、4分02秒刷新炮车兵。3、以前中路兵线刷新到中路汇集处约为
每日视点!解决shockwave flash崩溃问题
解决shockwaveflash崩溃问题,hockwaveflah作为网页播放器插件,经常崩溃的现像,现提出以下解决hockwaveflah崩溃问题的方法。
航天宏图(688066)2月9日主力资金净卖出100.16万元
截至2023年2月9日收盘,航天宏图(688066)报收于93 58元,下跌0 63%,换手率0 41%,成交量7654 47手,成交额7154 84万元。
学生用笔记本电脑性价比排行2021_学生用笔记本 简讯
现在是一个信息飞速发展的时代。信息之所以能发展的这么快,主要是因为网络的出现。现在人们用电脑上网比用手机上网多。电脑分为台式电脑、笔
养殖业板块2月9日涨0.33%,ST天山领涨,主力资金净流出1.59亿元
2月9日养殖业板块较上一交易日上涨0 33%,ST天山领涨。当日上证指数报收于3270 38,上涨1 18%。深证成指报收于12048 27,上涨1 64%。养殖业板
彝良引领返乡大学生 建设家乡
本报讯(通讯员赵学文)近年来,共青团彝良县委充分发挥县级团委的生源地优势,落实“四个一”措施,引领大学生返家乡参与社会实践,在服务...
密春雷前妻金晶照片介绍_非公众人物的前妻没有曝光
大家好,关于密春雷前妻金晶照片,非公众人物的前妻没有曝光的相关信息很多小伙伴还不太了解,小灵整理了相关内容来分享给大家,让我们一起来
天天日报丨云南省安宁市兑现稳增长奖金1884.6万元
2月8日,记者从云南安宁市委经济工作会议暨2023年度安宁市招商引资项目建设大会上获悉,在安宁经济社会稳步增长中,涌现出一批综合实力强劲、
2023汉马在哪里报名
➤2023汉马在哪里报名报名入口:登录武汉马拉松官网,进入个人中心,进入报名通道,完成报名。或登录官方合作马拉马拉APP或数字心动APP注册并
天天时讯:新金路(000510)2月9日主力资金净卖出4813.69万元
截至2023年2月9日收盘,新金路(000510)报收于6 35元,下跌1 7%,换手率3 26%,成交量18 51万手,成交额1 18亿元。
潮汐护符刷新时间 世界微速讯
在魔兽世界怀旧服中,潮汐咒符是一件非常使用的道具,可以让敌人昏迷三秒,很多玩家不清楚潮汐符咒在哪里可以获得,刷新时间是多久,那么下面
东莞市教育局赴北京定点招聘编制教师239名 天天速看料
近期,东莞市教育局将组织一批东莞优质公办初中、高中学校赴北京定点招聘编制教师239名,本科及以上学历均可报名。东莞,是粤港澳大湾区重要节