本文利用C语言介绍源文件是如何一步一步地编译、链接成为可执行程序的。
编译链接本身分为许多个过程,但从整体上可以概括为以下三点:
(资料图片)
分别通过编译器的编译,生成对应的目标文件。每个目标文件通过链接器链接在一起,形成一个独立单一而完整的可执行文件。链接时会在链接库内搜索C标准库及程序员个人函数库中的函数,并将其链接至可执行程序。整体过程如下图所示:
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定义等。
经过预处理后的文件后缀会变为i,文件以i为后缀代表其已经过预处理,但未进行下一阶段的编译。
在我们写代码时,包含头文件的是必不可少的,而在预处理中:包含头文件的操作等同于拷贝头文件中的代码,随后将源文件中的代码和头文件中的代码一起放入后缀为i的文件中。
预处理前:
预处理后:
相当于将头文件中的代码拷贝至源文件的头部,同时删掉#include"head.h"其效果与下面的代码相同,此时的文件后缀为i。
struct MyStruct{int a;int b;};int main(){struct MyStruct s;return 0;}在预处理时,源文件中宏定义内容会在i文件中被直接替换。
预处理前:
#include#define MAX 100int main(){int a = MAX;printf("%d\n", a);return 0;} 预处理后:
预处理后MAX会被直接替换为100,同时删除前面的#define MAX 100,其效果与下图代码相同。
在预处理时,编译器还会删除//后面的内容以及被/* */包括起来的内容,以便于接下来的编译阶段。
如图:
可以看到,不管是头文件、宏定义、还是注释,都是编译器对文本的操作。
因此可以说:预处理阶段是编译器对文本的操作阶段。
当源文件经过预处理后,便开始第二个阶段——编译,经过编译的文件的后缀将变成s,文件后缀为s代表其已经经过第二阶段的编译,但未进行汇编操作。
编译阶段会将C语言代码进行语法分析、词法分析、词义分析,以及符号汇总。
编译阶段从整体上看是对C语言代码进行分析解读由于该阶段涉及编译的原理,因此只了解大概即可,详见书籍《编译原理》。
当源文件经过第一、二阶段后,便开始第三个阶段——汇编,经过汇编的文件的后缀将变成o或obj,即开头所说的目标文件,文件后缀为o或obj代表其至少已经经过三个阶段的编译。
PS:在VS环境下生成的目标文件后缀为obj,在GCC环境下生成的目标文件后缀为o。
在第二阶段的编译中会将代码中的全局变量,函数名等汇总,并在汇编阶段形成类似一张表格。
收集以下代码中的全局变量与函数名:
形成表格:
符号表的详细作用在链接时详细介绍。
名 | 址 | ... |
|---|---|---|
val | 0X0012FF40 | |
add | 0X0012FF80 | |
main | 0X0012FF20 |
链接主要包括合并段表、符号表的合并及重定位两大过程。
下面依次介绍。
在源文件经过编译过程后文件后缀变为o或obj后,其内部的代码已经变成二进制。
此时,文件会将内部的二进制代码按类型划分成许多部分,每一部分就被称为一段。
如图:
前文我们说到,多个目标文件经过链接器后整合为一个独立而完整的文件,因此链接中合并段表的意思就是把多个目标文件中对应的段,合并在一个目标文件内。
顾名思义,将每个目标文件中的符号表合并成一个目标文件的符号表。
如果在写代码时发生函数定、声明、使用等不在同一源文件等情况,那么多个目标文件的符号表中可能都会有相同的函数名及无效的地址,像这样:
如上图,在两个文件中都有add的存在,那么,在head.obj和源.obj的符号表中都会有收录add。
但因源.c中没有对add进行实现,因此在汇总源.c的符号表时,其地址会被填入一个无效的地址。
在链接过程中,链接器不仅会对符号表合并,也会将多余的符号删除,同时将每个符号的地址都定位为所有地址中有效的那一个。
如果在写代码时不小心将函数名写错了,像这样:
那么由于在head.h汇总符号表时找不到代码实现,就会把Add的地址赋为一个无效的地址,像这样:
名 | 址 |
|---|---|
Add | 0X00000000 |
add | 0X0012FF40 |
但是,在符号表的重定位时,也没有重定位Add的有效地址,那么链接就无法完成,就会报出典型的错误:
PS:函数声明extern的作用就是告诉编译器,遇到无法解释的符号先别急着报错,后面会有定义的。
多个源文件经过预处理(头文件包含、宏定义替换、注释的删除),编译(语法分析、词法分析、词义分析、符号汇总),汇编(二进制指令翻译、形成符号表)后成为一个目标文件。
多个目标文件在链接库的帮助下完成合并段表,符号表合并,符号表重定位后整合为一个目标文件。
到最后变成一个可执行的exe文件。
感谢您的阅读与耐心~
预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预...
国际漫游怎么收费,出国旅游受到越来越多人的欢迎,今天为大家介绍一下国际漫游的收费标准。国际漫游业...
开学季到来,为进一步强化学校安全防范工作,切实维护师生人身安全,让学生们能够顺利回归校园。宁强县...
教具有哪些,教具包括教学设备、教学仪器、实训设备、教育装备、实验设备、教学标本、教学模型等。教具...
世名科技最新股东户数1 1万户,低于行业平均水平。公司户均持有流通股份1 66万股;户均流通市值20 9万元。
本周开始,我们将在2022年最好的设备之一上节省大量费用,因为更实惠的OnePlus10Pro版本现在更加经济实惠,这要
一、合同如何有法律效应合同有法律效应的条件如下:1 主体资格合法。劳动者的主体资格合法,指劳动者必...
那就送兄弟生日礼物,一定要有新意一点的,不一定要贵的,但是要表达一下你对兄弟的祝福。实用创意的u盘...
四方交易正式完成!小佩顿回归勇士怀斯曼离队,联盟将调查开拓者,交易,小佩顿,勇士队,nba,全明星,美国篮...
如果男生不送礼物给你,他就很高兴,但是有些男生就是这样的人,不要大气的。其实送男人的礼物还真没多...
1、如果你的WORD的度量值为“磅”,先改为“厘米”。2、在工具菜单,选项,常规里可改。3、然后选中图片...
同花顺金融研究中心2月13日讯,有投资者向大东方提问,请问公司旗下儿科医疗板块有治疗儿童心理问题的门...
关于报告的所有内容,公众『行业报告智库』阅读原文或点击菜单获取报告下载查看。摘要:报告旨在为跨境商...
你可以送一些可爱的或者可爱点的东西,或者是漂亮的衣服,或者是鞋子。这些都是女人的最好礼物。可爱的...
1、腾讯真是有点不合理了,咱们网友们还团结了,以后要是腾讯还这么霸道。2、网友们就团结都不要玩腾讯...
1、简立威,男,摄影师,北京电影学院进修,1983年,进入珠影厂后一直从事摄影师工作。2、后在北京电影...
切尔西vs西汉姆首发:菲利克斯解禁复出,奇克、恩佐、库库出战,奇克,库库,西汉姆,席尔瓦,查洛巴,切尔西...
1、声音的传播:(1)声音靠介质传播,气体、液体和固体都可以传播声音。2、真空不能传声;(2)声音在介质中...
1、你是什么牌子的电脑。2、就去那个牌子的官网就可以找到了。本文就为大家分享到这里,希望小伙伴们会...
1、嘉佳卡通是经国家新闻出版广播电影电视总局批准成立的全国五大卡通卫视之一。2、嘉佳卡通全国收视份...