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),然后将目标文件和库链接形成最后的可执行文件。

 

 

原文地址:https://www.cnblogs.com/yuanqiangfei/p/14559990.html