GCC编译过程


编写如下程序hello.c作为示例
预处理--ccl(编译器)
- 将#开头的预处理语句转换后重新插入
- 删除所有注释
- 得到
hello.i
编译--ccl(编译器)
词法分析、语法分析等等内容,生成汇编代码hello.s,默认AT&T格式,添加选项-masm=intel可以生成intel格式,-fno-asynchronous-unwind-tables生成无cfi宏的汇编指令更加易读。
下面的printf只有一个参数,被优化为puts了
汇编--as(汇编器)
翻译为机器指令hello.o文件
-c选项可以直接从hello.s或者hello.c生成hello.o

链接--collect2(链接器)
默认动态链接,选项-static指定静态链接
这部分内容负责空间分配、符号绑定、重定位等
生成ELF文件,部分如下

参数
gcc -x lang file
设定文件所使用的语言,默认为c语言。
这样做会使gcc忽略文件扩展名,将.c改为.abc也无所谓。
可用的参数有:c, objective-c, c-header, c++, cpp-output, assembler, 与 assembler-with-cpp。
例:
gcc -x c hello.abcgcc -x none file
不主动设定文件使用的语言,要求其根据扩展名确定语言。
例:
gcc -x none hello.c这里根据扩展名.c会确定为C文件。
gcc -c file
只执行前三步,即预处理、编译、汇编,输出一个obj文件。
gcc -c hello.c生成的文件为hello.o
gcc -S file
只执行前两步,即预处理和编译,生成汇编文件。
gcc -S hello.c生成的文件名为hello.s
gcc -E file
只执行第一步:预处理,不生成文件,但是可以进行重定向到一个输出文件。
gcc -E hello.c > hello.txtgcc -o file
指定一个输出目标。
gcc -c hello.c -o hello.ogcc -pipe
使用pipe作为编译中的临时文件。
gcc -pipe -c hello.c -o hello.ogcc -incllude file
包含某个文件,作用类似于#include
gcc -C
预处理后不删除注释信息。
gcc -static
使用静态链接(默认为动态)
gcc -share
尽量使用动态库
版权声明:本文为qq_30379221原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。