GCC编译器
GCC(GNU Compiler Collection,即 GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件.
编译过程简介
1、直接将源文件编译成可执行文件
gcc hello.c -o hello
从.c文件生成直接运行的二进制文件的转换过程:
(1)预处理
gcc -E hello.c -o hello.i
- 删除#define,展开所有宏定义。例#define portnumber 3333
- 处理条件预编译 #if, #ifdef, #if, #elif,#endif
- 处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的, 文件内可能包含其他“.h”文件。
- 删除所有注释。/**/,//。
- 添加行号和文件标识符。用于显示调试信息:错误或警告的位置。
- 保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。
(2)编译
gcc -s hello.c -o hello.s
- 扫描(词法分析)
- 语法分析
- 语义分析
- 源代码优化(中间语言生成)
- 代码生成,目标代码优化。
(3)汇编
gcc -c hello.c -o hello.o
汇编器是将汇编代码转变成可以执行的指令,生成目标文件。
(4)链接
gcc hello.o -o hello
将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正,链接过程主要包括了地址和空间分配、符号决议和重定向。
- 地址和空间分配
- 符号决议:有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。比如说 int a = 6;这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是4.
- 重新计算各个目标的地址过程叫做重定位。最基本的链接叫做静态链接,就是将每个模块的源代码文件编译成目标文件(Linux:.o Windows:.obj),然后将目标文件和库链接形成最后的可执行文件。