0


C代码编译过程详解

C代码编译过程

过程简介

hello.c

代码为例,当我们编译

hello.c

时。

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

一般使用的编译命令是

gcc -o hello hello.c

我们能看到通过该命令后会得到一个可执行文件

hello

,执行该程序

./hello

我们会在界面上看到

hello world

一般而言我们不需要追究编译的细节,就好比我们去餐厅吃饭,我们不需要去细问厨师是先放盐还是先放油。但如果我们有志于成为一个合格的厨师的话,那么这些做菜的细节就很重要,事实上从

hello.c

变成

hello

也是有很多过程的,分别是预处理,将头文件放入

hello.c

中,将宏定义进行替换,将注释去掉等,得到

hello.i

文件。接着是编译,将

hello.i

文件由代码变成汇编语言,得到

hello.s

,再接着是汇编阶段,将

hello.s

翻译成机器语言指令

hello.o

。最后是链接阶段,将调用的函数合并到

hello.o

中,比如再

hello.c

中我们调用了

printf

函数,这个函数的预编译好的文件

printf.o

就是在这个阶段与

hello.o

进行合并生成我们最终的可执行文件

hello

在这里插入图片描述

预处理

预处理阶段,预处理器

cpp

根据以字符

#

开头的命令对原始的代码进行处理。以上文的

hello.c

为例,在这个环节,预处理器

cpp

会根据第一行的命令

#include <stdio.h>

stdio.h

文件中的所有内容插入到

hello.c

中。我们可以使用

gcc

命令来对这个环节进行观察。

gcc -E hello.c -o hello.i

我们使用

vim

打开

hello.i

文件,我们会发现多了700多行代码,在文件的最后我们找到了自己写的代码。
在这里插入图片描述

编译

编译阶段,编译器

ccl

将C语言代码

hello.i

翻译为汇编语言

hello.s

,我们使用

gcc

命令观察这个环节

gcc -S hello.i -o hello.s

使用

cat

或者

vim

打开

hello.s

文件,其内容如图所示
在这里插入图片描述

汇编

汇编阶段,这个阶段将汇编语言翻译为机器语言也就是

01

hello.s

也将变成二进制文件

hello.o

,我们使用

gcc

命令定位到这个阶段。

gcc -C hello.s -o hello.o

我们用

vim

打开

test.o

只能看到乱码,使用

xxd

hello.o

以16进制的形式展现出来。
在这里插入图片描述

链接

链接阶段将其他已经预编译好的

.o

文件链接整合到一起,比如过程简介环节提到过的

printf.o

文件,我们使用

gcc

命令进行定位

gcc hello.c -o hello

使用

xxd

hello

以16进制的形式展现出来。
在这里插入图片描述


本文转载自: https://blog.csdn.net/liaoyaonline/article/details/120538889
版权归原作者 liaoyaonline 所有, 如有侵权,请联系我们删除。

“C代码编译过程详解”的评论:

还没有评论