编译链接流程

2021-12-31  本文已影响0人  SeatonLv

对于C这种编译性语言,我们平时编译时,不管是通过IDE图形界面,还是通过命令行,总感觉编译一下就完成了,然后就得到了针对某OS和某CPU的二进制可执行文件(机器指令的文件)。但是实际上在源码到可执行文件中间隐藏了四个过程,这四个过程被OS默默的处理了。

编译四个过程:预处理、编译、汇编、链接

1.预编译

如果编译过程是一次性完成的话,.i文件只是一个过渡性文件,.i被称为扩展后的c源码文件。


image

预处理做了哪些工作?

①宏替换:将宏替换为真实的宏体,比如 程序性中有使用NUM这个宏,这个宏的定义为#define NUM 100,程序中所有的NUM都会被替换为100。

②包含头文件 将include包含的.h头文件内容,全部复制到.c文件中,因为头文件中定义了类型、宏、函数声明等等,这些都是函数调用会用到的,你调用某个函数时,就必须包含这个函数要的头文件。

疑问:头文件那么多内容,都包含进去的话,不会太多了吗?

编译时,编译器只使用要用的东西,用完后包含的内容都会被丢弃,实际上并不占空间。

③条件编译 处理#if #endif 这类的东西

④处理一些特殊的预处理关键字

2.编译

预编译.l文件到.s 汇编文件


image

编译做了什么
将c语法的c源码,翻译为汇编语法的汇编源码。

3.汇编

汇编文件到二进制文件


image

4.链接

image

链接(连接)做了什么

①将众多的.o合成一个完整的可执行文件。 .o实现相互依赖的,比如a.o中调用的函数,被定义在了b.o中,如果不链接在一起的话,是无法工作的。

②链接时,需要加入额外的启动代码。这个启动代码并不是我们自己写的,main函数是由启动代码调用的,我们的程序是从启动代码开始运行的。

③链接为一个可执行文件时,需要进行符号解析和地址重定位

上一篇下一篇

猜你喜欢

热点阅读