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
得到的结果如下: