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

简介:

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

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搜索头文件/库文件时使用的搜索路径。

相关文章
|
3月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
44 0
006.gcc编译器
|
4月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
414 1
|
8天前
|
C语言
转载 - gcc/ld 动态连接库和静态连接库使用方法
本文介绍了如何在GCC中实现部分程序静态链接、部分动态链接。使用`-Wl`标志传递链接器参数,`-Bstatic`强制链接静态库,`-Bdynamic`强制链接动态库。
15 0
|
1月前
|
编译器 C语言 C++
列举gcc 常见和有用的编译警告选项
列举gcc 常见和有用的编译警告选项
11 0
|
1月前
|
编译器 C语言
gcc编译警告:warning: suggest parentheses around assignment used as truth value
gcc编译警告:warning: suggest parentheses around assignment used as truth value
16 0
|
1月前
|
编译器 Linux C语言
gcc编译器的使用方法
gcc编译器的使用方法
21 1
|
2月前
|
编译器 C语言
gcc/g++语法
gcc/g++语法
|
4月前
|
C语言
gcc静态编译/usr/bin/ld: cannot find -lc
gcc静态编译/usr/bin/ld: cannot find -lc
|
5月前
|
编译器 程序员 C语言
gcc的编译过程和gcc与g++的区别
gcc的编译过程和gcc与g++的区别
53 0
|
6月前
|
C语言
编译安装gcc
编译安装gcc