《编译与反编译技术实战》——1.4节编译器GCC

简介:

本节书摘来自华章社区《编译与反编译技术实战》一书中的第1章,第1.4节编译器GCC,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区“华章社区”公众号查看

1.4 编译器GCC
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。它是以GPL许可证发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类UNIX操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。随着GCC的快速扩展,其可支持C++,后来又能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名为GNU编译器套件。
(1)前端接口
前端将高级语言源码经过词法分析、语法分析生成与高级语言无关的低级中间层表示GENERIC,然后经过单一化赋值转化为另一种中间表示层GIMPLE,在中间层GIMPLE组建控制流程图,并在GIMPLE上进行一系列优化。然后将其转换为更加便于优化的RTL中间表示层。有了与前端无关的中间表示,GCC的前端将不同的高级编程语言转换成这种中间表示,这就是GCC处理器支持多种编程语言的根本原因。
(2)中间接口
中间接口主要在RTL中间表示上进行各种优化,GCC的优化技巧根据版本不同而有很大不同,但都包含了标准的优化算法,如循环优化、公共子表达式删除、指令重排序等。更多的优化方法也在不断地研究中。
(3)后端接口
GCC后端对每条RTL通过模板匹配的方法调用对应的汇编模板生成汇编代码。生成的代码因处理器和结构不同而不同,GCC后端为不同的平台提供了描述指令的汇编模板文件,这样就可以实现对不同平台的支持。这个阶段非常复杂,因为必须要考虑GCC可移植平台的处理器指令集的规格与技术细节,解决指令选择和寄存器分配等问题。
(4)GCC常用的参数
在使用GCC编译器的时候,必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。具体细节内容可参考GCC Manual。
GCC最基本的用法是:

gcc [options] [filenames]

其中options就是编译器所需要的参数(也称为编译选项),filenames给出相关的文件名称。
-c:只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成以.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename:确定输出文件的名称为output_filename,同时这个名称不能与源文件同名。如果不给出这个选项,GCC就给出预设的可执行文件a.out。
-g:产生符号调试工具(GNU的gdb)所必要的符号信息,要想对源代码进行调试,必须加入这个选项。
-O:对程序进行优化编译、链接。采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度相应地要慢一些。
-O2:比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
-v:GCC执行时执行的详细过程、GCC及其相关程序的版本号。编译程序时加上该选项可以看到GCC搜索头文件/库文件时使用的搜索路径。

相关文章
|
5月前
|
编译器 C语言
C语言编译详解:GCC分步编译与一次编译多个文件
C语言编译详解:GCC分步编译与一次编译多个文件
489 2
|
程序员 Linux Android开发
libYuv编译
安卓使用NDK编译libYuv库
470 0
|
缓存 Java Shell
ThingsBoard详细编译指南2.4.3
ThingsBoard详细编译指南2.4.3
646 0
|
自然语言处理
编译
编译
118 0
|
开发工具 C++ git
DCMTK-001-3.6.6编译
DCMTK-001-3.6.6编译
291 0
DCMTK-001-3.6.6编译
|
存储 自然语言处理 编译器
【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程(一)
【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程(一)
275 0
|
存储 编译器 C语言
【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程(二)
【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程(二)
388 0
|
数据安全/隐私保护 网络安全 PHP