当我们把一个C语言程序翻译成二进制的时候需要经历预处理、编译、汇编、链接这几个过程。本片文章将用Linux一一展示这几个过程。
1、预处理
预处理的作用:a.宏替换 b.头文件展开 c.去注释 d.条件编译
先写一个简单的C程序
[ldx@VM-8-4-centos 2022_08_23]$ gcc -E test.c -o test.i
-E:从现在开始对程序进行翻译,当预处理完成停下
-o:将结果写道test.i
用vim读取test.i,在底行模式输入vs test.c 可以进行分屏,对比着看
ctrl+w+w 切换屏幕
可以发现,test.i中的行数变多了,因为头文件展开了,而主函数中宏替换了,注释也没了
2、编译
将C语言翻译成汇编语言
[ldx@VM-8-4-centos 2022_08_23]$ gcc -S test.i -o test.s
-S:当编译完成后停止
3、 汇编
将汇编语言翻译成二进制文件
[ldx@VM-8-4-centos 2022_08_23]$ gcc -c test.s -o test.o
-c:当汇编完成后停止
当我们用vim进入test.o文件时已经看不懂了,因为这是个二进制文件
需要用二进制文件专用的查看工具
[ldx@VM-8-4-centos 2022_08_23]$ od test.o
4、链接
stdio.h中只有声明,而具体方法的实现是在库文件中,因此需要链接过程,将我们的代码和库里边的代码关联起来。
[ldx@VM-8-4-centos 2022_08_23]$ gcc test.o -o mytest
链接之后就生成了可执行程序
查看文件属性的时候,也可以看到mytest文件是可执行的