编译链接理解

关于编译链接学习可以让我们深刻理解到语言的层次,下面讲一下编译链接

首先我们看一下我们常用的写代码环境

我们常用的vs2019等这些编译器他们都是集成开发器

而我们的翻译环境可以分为编译和链接

3ae1ae783a084cc6b1a9cd7ac51bc040.png

 我们首先看一下编译链接的大体逻辑

b2168b3774e84992987cd4b1703dcb6b.png

我们的源文件首先需要经过编译器生成目标文件,最后我们将生成的目标文件链接之后生成唯一一个可执行程序

下面我们看一下编译链接的每一个步骤

 31d99a2208a84cf4adfc2317b59e408a.png

 我们可以仔细看每一步

首先就是编译的第一步

第一步就是预编译(预处理)我们预处理的作用就是头文件的展开,宏的替换,还有删除注释,其中例如#include和#define这些都是预处理的指令,就是在预处理的时候展开头文件等其中我们如果想要单独的对他进行预处理的话,我们需要在gcc上面,我们可以gcc -E test.c -o test.i

其中-E就是完成预处理,而-o的意思是指定生成文件名,而预处理之后生成的文件名是.i文件

下一步是编译

编译的作用是把C语言翻译成汇编代码,其中还会进行   语法分析   词法分析    语义分析    符号汇总

而想要进行单独的编译我们需要在gcc中进行

gcc -S test.i -o test.s

这一步会生成.s文件,这里面就是汇编代码

 

下一步是汇编,而汇编的作用是把汇编代码翻译成了二进制指令

其中还会生成符号表

而这一步我们需要

gcc -c test.s -o test.o

这一步会生成.o文件,此时该文件里面存档的就是二进制,打开后就是一堆乱码

而这一步会生成符号表,符号表和最后的链接有大的相关

 

 

而最后一步链接是最重要的,我们在这一步会

1.合并段表

2.符号表的合成和重定位

其中,就是把每个目标文件最后生成的符号表都合并,然后把有用的地址保留下来,最后合并为一个

其中重定位,简单来说就是,例如如果我们把函数的声明和定义分离,链接就是把声明和定义的的地址给重定位就可以了

最后就生成唯一一个可执行程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值