如何将C文件编译流程描述为一系列?

摘要:1、程序的生命周期 ​	一个hello.c文件从编写到输出经历了四个阶段,如图所示,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。 预处理阶段 预处理阶段主要将头文件插入到程序文本中,得到hel
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 ​ 得到的结果如下: