首页 >资讯 > > 正文

详解源文件编译链接至可执行程序的每一步 当前滚动

腾讯云 2023-02-11 05:56:01

前言

本文利用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 合并段表

在源文件经过编译过程后文件后缀变为oobj后,其内部的代码已经变成二进制。

此时,文件会将内部的二进制代码按类型划分成许多部分,每一部分就被称为一段。

如图:

前文我们说到,多个目标文件经过链接器后整合为一个独立而完整的文件,因此链接中合并段表的意思就是把多个目标文件中对应的段,合并在一个目标文件内

II 符号表的合并

顾名思义,将每个目标文件中的符号表合并成一个目标文件的符号表。

III 符号表的重定位

如果在写代码时发生函数定、声明、使用等不在同一源文件等情况,那么多个目标文件的符号表中可能都会有相同的函数名及无效的地址,像这样:

如上图,在两个文件中都有add的存在,那么,在head.obj源.obj的符号表中都会有收录add。

但因源.c中没有对add进行实现,因此在汇总源.c的符号表时,其地址会被填入一个无效的地址

在链接过程中,链接器不仅会对符号表合并,也会将多余的符号删除,同时将每个符号的地址都定位为所有地址中有效的那一个

IIII 找不到符号报错

如果在写代码时不小心将函数名写错了,像这样:

那么由于在head.h汇总符号表时找不到代码实现,就会把Add的地址赋为一个无效的地址,像这样:

Add

0X00000000

add

0X0012FF40

但是,在符号表的重定位时,也没有重定位Add的有效地址,那么链接就无法完成,就会报出典型的错误:

PS:函数声明extern的作用就是告诉编译器,遇到无法解释的符号先别急着报错,后面会有定义的。

四、全文总结

多个源文件经过预处理(头文件包含、宏定义替换、注释的删除),编译(语法分析、词法分析、词义分析、符号汇总),汇编(二进制指令翻译、形成符号表)后成为一个目标文件。

多个目标文件在链接库的帮助下完成合并段表,符号表合并,符号表重定位后整合为一个目标文件。

到最后变成一个可执行的exe文件。

感谢您的阅读与耐心~

上一篇:全球今日报丨为啥孙俪、海清一直都剪短发?看完她们的“长发造型”,我悟了! 下一篇:最后一页
x
推荐阅读

详解源文件编译链接至可执行程序的每一步 当前滚动

2023-02-11

全球今日报丨为啥孙俪、海清一直都剪短发?看完她们的“长发造型”,我悟了!

2023-02-11

京东钱包怎么开通?怎么使用?|今日讯

2023-02-11

天天热消息:大禹治水打正确生肖猪_大禹治水打正确生肖

2023-02-10

“早”字当先除草害,全力以赴保夏粮

2023-02-10

浓眉解释:当时没意识到詹姆斯在那一刻创造历史 我向他道了歉

2023-02-10

把无聊的事和故事写到有趣(日常生活文案技巧) 全球新资讯

2023-02-10

明尤侃犀角雕荷叶螳螂杯_对于明尤侃犀角雕荷叶螳螂杯简单介绍 全球快资讯

2023-02-10

中国已上市,这款新冠药会刺激病毒变异?科学家呼吁停用,美国医药巨头回应

2023-02-10

妖精的尾巴中的妖精女王_世界快看点

2023-02-10

免费开放!烟台又多一处网红打卡新地标! 环球微头条

2023-02-10

精选!融情黑土地 助农勇担当

2023-02-10

迈腾发动机故障灯亮怎么消除-迈腾发动机故障灯亮是什么原因 环球速看料

2023-02-10

最新消息:皮冻怎么熬制

2023-02-10

全球即时看!【机构调研记录】德邦基金调研立高食品

2023-02-10

云南新增8例确诊6例无症状,云南新增8例确诊6例无症状感染者

2023-02-10

投资电影怎么选择项目?认购独行月球稳赚不赔?

2023-02-10

天天热文:知念侑李个人资料 知念侑李参演作品

2023-02-10

阴茎不发育怎么办_阴茎硬不坚怎么办|世界新视野

2023-02-10

班主任计划高中_班主任计划高中

2023-02-09

风之谷主题曲_宫崎骏风之谷主题曲

2023-02-09

杰克股份: 杰克股份:关于股份回购事项前十大股东和前十大无限售条件股东持股情况的公告 全球观焦点

2023-02-09

当日快讯:乘联会:1月特斯拉Model 3零售销量同比增长超三倍

2023-02-09

2023年11月14日黄历查询,2023年11月14日是黄道吉日吗?

2023-02-09

环球关注:网友问兰新高铁何时复运 兰铁局回应来了

2023-02-09

美瑞新材:公司PBS材料目前尚处于市场开发和推广阶段|今日热讯

2023-02-09

当前关注:淘宝推广方法 淘宝推广怎么做

2023-02-09

华脉科技:公司没有AIGC、ChatGPT概念_热议

2023-02-09

世界速看:中国救援队82人已抵达土耳其

2023-02-09

原神塞西莉亚苗圃怎么开 解锁的方法介绍|世界微速讯

2023-02-09

天天热文:你们怕是搞错了,AI恰恰最能背锅

2023-02-09

天天视讯!郭追江生孙建罗莽鹿峰照片_郭追江生罗莽鹿峰电影

2023-02-09

【时快讯】ofo回应2.5亿元诉讼 ofo押金仍有望退还!

2023-02-09

金丝鼠寿命多长_金丝鼠寿命能达到多少 天天百事通

2023-02-09

西红柿打卤面的做法详细步骤|每日热闻

2023-02-09

货车从业资格证模拟考试科目二_货车从业资格证模拟考试_环球快看

2023-02-09

cyanocobalamin

2023-02-08

环球快看:狻猊古代传说故事

2023-02-08

阿克苏诺贝尔2022年营收达7.08亿欧元,同比下降36.7%|讯息

2023-02-08

环球快资讯丨DC在布鲁氏菌持续性感染形成中的作用及机制研究

2023-02-08

【热闻】中国教师节的来历

2023-02-08

全球新动态:比利时足协官方:搭档特德斯科,名宿维尔考特伦担任体育总监

2023-02-08

狼人公会名字大全霸气_狼人杀公会名字

2023-02-08

环球动态:北虫草种植方法

2023-02-08

常州哪些人可以申请异地就医备案?|世界头条

2023-02-08

感冒流感新冠治疗,连花清瘟中医组方优势多

2023-02-08

中播数据涨近5% 签署协议为菲律宾提供数字网路服务平台

2023-02-08

步入小学祝福语_世界速读

2023-02-08

速读:汇纳科技2月8日快速上涨

2023-02-08

MA

2023-02-08

世界微动态丨干杯朋友吉他谱

2023-02-08

天天观察:洗衣粉和洗衣液哪个去污效果好_洗衣粉和洗衣液哪个好

2023-02-08

玩游戏笔记本电脑风扇声音大怎么办_笔记本电脑风扇声音大怎么办 环球新要闻

2023-02-08

清蒸鸽子的做法与功效_清蒸鸽子的做法_天天看热讯

2023-02-08

环球通讯!黄磊17岁大女儿引争议,有网友不乐意了

2023-02-07

条件反射的发现者_世界时快讯

2023-02-07

漯河市保障标准再次提高!受益者是农村低保和特困供养人员

2023-02-07

世界快资讯:Si-B-C-N系陶瓷的新型合成方法及其氧化动力学研究

2023-02-07

环球今亮点!学挖掘机多少钱学费_学挖掘机

2023-02-07

几米作品全集

2023-02-07

TH500洛氏硬度计

2023-02-07

西媒分析土耳其地震活动频繁原因:板块位置致多个断层穿过该国_全球微头条

2023-02-07

2023上海夏天要热到几月份|每日热文

2023-02-07

异动快报:华锋股份(002806)2月7日10点8分触及涨停板|每日快播

2023-02-07

当日快讯:世卫官员:震后一周伤亡统计将大幅增加,土耳其地震或致2万人死亡

2023-02-07

什么叫本科和专科_什么叫本科_今日视点

2023-02-07

中国男篮国奥队_国奥男篮比赛

2023-02-07

天天实时:三原县丁留村

2023-02-07

上关镇青索完小志愿服务队

2023-02-06

毕业歌词大全视频_毕业歌词

2023-02-06

除夕夜执勤后倒在家门口,鄂红兵:一片丹心在路上

2023-02-06

上海往事:最后的玛祖卡

2023-02-06

天天观速讯丨团队管理核心十点(收藏备用)

2023-02-06

上海格捞贯餐饮管理有限公司

2023-02-06

元宵节庄河面塑属相灯亮相央视|环球视讯

2023-02-06

上海盛铭物流有限公司

2023-02-06

全球观点:现在的A股像极了2019年1月份:都知道是个机会,却又怕的要死

2023-02-06

全球播报:火舞黄沙

2023-02-06

天天看热讯:潞州区高标准推进 “星级文明户”创评活动

2023-02-06

葡萄是凉性还是热性水果 葡萄有什么营养价值 环球最资讯

2023-02-06

植树造林的好处 世界百事通

2023-02-05

华欣-热消息

2023-02-05

世界看热讯:宋朝曹皇后嫁过人_宋朝曹皇后

2023-02-05

北京冬奥会官方电影即将上映_全球速讯

2023-02-05

吴咏宁

2023-02-05

每日讯息!反导弹系统

2023-02-05

热推荐:全国灯会热搜城市前三中两个来自四川!

2023-02-05

全球观焦点:加了微信,才知道南红直供这么便宜,产地才卖这价!

2023-02-05

潘粤明与董洁世纪和解,潘粤明陪顶顶度过14岁生日,两人破冰互动 播报

2023-02-05

环球看热讯:利物浦跟队记者:本以为0-3输布莱顿是低谷,没想到今天更差

2023-02-05

环球播报:抗战之敌后武工队

2023-02-04

【全球独家】三伏潭

2023-02-04

世界播报:营业执照年审网上申报_成都营业执照年审

2023-02-04

动车候补订单什么意思 动车候补是什么意思

2023-02-04

天天动态:北京企业管理学院

2023-02-04

苗苗探班老公郑恺, 一家人吃火锅,幸福无比!

2023-02-04

爆款双口,爱兰博35W双USB-C氮化镓充电器新品接受订单

2023-02-04

中美调解培训启示录 今日视点

2023-02-04

焦点简讯:丰满度

2023-02-04

全球快看点丨洛阳东宣假日酒店

2023-02-04