C文件编译流程

1、程序的生命周期

​ 一个hello.c文件从编写到输出经历了四个阶段,如图所示,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。

  • 预处理阶段

    预处理阶段主要将头文件插入到程序文本中,得到hello.i文件

  • 编译阶段

    编译器将hello.i中的语言翻译成汇编语言,得到hello.s

  • 汇编阶段

    汇编器将hello.s中的语言翻译成机器语言指令,并将这些指令打包成可重定位目标程序,生成hello.o文件

  • 链接阶段

    链接器负责将多个.o文件链接在一起,例如hello.c中调用了printf函数,它是C标准库中的一个函数,其存在于一个printf.o的单独的预编译好了的目标文件中,链接器合并完成后,得到了hello可执行文件

2、实例

2.1 编译指令

​ gcc是linux上默认的编译器,我们输入以下命令来编译程序

gcc -Og -o hello hello.c

​ 编译器在编译的过程中会优化代码,为了更好的理解原始代码和产生的机器代码之间的关系,我们添加了-Og编译选项来降低编译器的优化等级。
编译完成之后,生成hello可执行文件,运行hello文件:

./hello

2.2 查看编译过程中产生的汇编代码

​ 可以通过将编译指令中的 -o改成 -S,这样就能看到C语言编译器产生的汇编代码,但是不做其他工作。

gcc -Og -S hello.c

​ 运行后,会在目录中生成一个hello.s的文件,文件如下所示:

2.3 查看编译过程中的hello.o文件

​ 与2.2一致,使用-C命令行选项,GCC会编译并汇编该代码

gcc -Og -c hello.c

​ 通过cat命令查看生成的hello.o的文件,会发现里面是乱码,因为其是二进制格式的,所以无法直接查看,可以通过objdump命令来反汇编hello.o文件:

objdump -d hello.o

​ 得到的结果如下:

posted @ 2023-09-18 21:24  mjy66  阅读(39)  评论(1编辑  收藏  举报