《编译与反编译技术实战》——1.4节编译器GCC-阿里云开发者社区

开发者社区> 华章计算机> 正文

《编译与反编译技术实战》——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搜索头文件/库文件时使用的搜索路径。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
成为一个编译器之「使用 JavaScript 来制作编译器」
本文讲的是成为一个编译器之「使用 JavaScript 来制作编译器」,布希维克,布鲁克林,一个很棒的周日。我在书店里发现了一本书 John Maeda 写的 “Design by Numbers” 。
1111 0
IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库
启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件。也可以按取消后再把文件拖进IDA。由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了。
1019 0
IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名
首先看看windows IDA和xcode的反汇编有什么不同。因为不确定直接分析UIKit的代码会不会有法律问题,还是自己写个例子吧。分析UIKit的时候因为没有完整的debugging symbols,所以得到的反汇编信息会比自己写的代码较少。
810 0
[Maven实战](6)仓库(本地仓库,远程仓库,镜像)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50587876 1. 简介 maven可以在某个位置统一存储所有maven项目共享的构件,这个统一的位置就是仓库。
1356 0
深入探究VC —— 资源编译器rc.exe(3)
Windows应用程序中,图标、菜单、畏途、图标、工具条、对话框等是以资源的形式存在的。开发人员也可以自定义资源类型。如果一个程序使用了资源,那么它在构建时需要对资源进行编译。程序所使用的资源会在资源脚本文件(*.rc)中进行描述编写,编译时,资源编译器会将*.rc文件编译为可链接的.res文件。
931 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载