一、gcc的使用
(一)程序编译过程
程序编译的四个过程:预处理、编译、汇编、链接
1、预处理:gcc -E main.c -o main.i
生成.i文件将进行如下操作:
(1)将所有的#define删除,并展开所有的宏定义。
(2)处理所有的预编译指令,例如: #if,#elif,#else,#endif等
(3)处理#include预编译指令,将所包含的文件插入到预编译指令的位置
(4)添加行号信息,文件标识,便于调试
(5)删除所有的注释
(6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pargma指令来设定编译的状态或者是指示编译器完成一些特定的动作。
(7)生成.i文件(包括去注释、宏替换、头文件展开、条件编译),编译生成的.i文件不包含任何宏定义,因为宏已经被展开,并且包含的文件已经被插入到.i文件中。
2、编译:gcc -S main.i -o main.s (将c/c++转换成汇编)
生成.s文件,需要进行如下操作:
(1)扫描、语法分析、语义分析、源代码分析、目标代码生成、目标代码优化
(2)生成汇编代码
(3)汇总符号
(4)生成.s文件
3、汇编:gcc -c main.s -o main.o (将汇编转换成二进制)
生成.o文件,需要进行如下操作:
(1)根据汇编指令和特定平台,把汇编指令翻译成二进制形式
(2)合并各个section,合并符号表
(3)生成.o文件
4、链接:gcc main.o -o main
链接过程会进行如下操作:
(1)合并各个.obj文件的section,合并符号表,进行符号解析
(2)符号地址重定位
(3)生成可执行文件
(二)gcc的使用
常用的两种生成可执行程序的