阅读更多

6顶
0踩

编程语言

原创新闻 了解 GCC 4

2008-11-06 15:52 by 副主编 QQbyte 评论(2) 有9857人浏览
八月初 Mark Mitchell 发布了 GCC 4.3.2 版本,GCC是GNU编译集合,包括C, C++, Objective-C, Fortran, Java, and Ada编译器等。从这里下载最新的GCC: http://gcc.gnu.org/mirrors.html



让我们了解一下GCC 4:

在过去的几年中,GNU Compiler Collection (GCC)一直在做GCC 3 到 GCC 4 的主要版本转换。GCC 4是一个重要的版本,GCC 4 新增了很多新的最优化框架(和新的中间代码生成),新的架构和语言支持,多种新属性和选项变化。了解GCC 4新的属性和它们的优点很有必要。

GCC是所有开发的基石,不管是对开源世界和闭源世界。它让操作系统和架构能够运行。当一个新的处理器出现,它必须依赖一个GCC版本支持(GCC在后台为它提供代码生成)。GCC也让开源操作系统Linux得以运行,让Linux进入嵌入开发领域成为现实……

但是GCC并不是静止的,新的处理器架构不停的出现,新的研究发现更好的方式来生成最优化代码,所以GCC也在一直在发展中,并且成功的发布了新的主要版本GCC 4。本文将浏览GCC的核心修改,让你熟悉新的编译标准。

首先简短复习一下的GCC历史:

GCC 最初是GNU C Compiler,由大名鼎鼎的 Richard Stallman 同学 在1987年首次发布。Richard开始这个项目于1984年,期望建立一个免费的C编译器,能够被使用和修改。GCC 最初跑在早期的Sun和DEC VAX系统上。

作为一个开源的编译器(意味着源代码是公开的),其他开发者也在热心帮助修复bug,更重要的是升级GCC支持新的语言和其他目标架构。不久以后,它的名称变成GNU Compiler Collection,它已经支持多种语言和最流行的架构。

GCC发布历史:



今天GCC已经成为最流行的编译器,支持Ada, Fortran, the Java™ language,  C 的变种 (C++ 和 Objective-C),以及覆盖了最大范围的处理器架构(支持30种处理器家族),GCC源代码移植到了超过60种平台,也是目前现存的最复杂的开源系统,GCC现在拥有大概150万行源代码。

在开始之前简单了解GCC的基本架构:

编译器是一种pipeline管道架构,通过不同的层次为不同类型的数据进行通讯(见下图)。前台编译器针对特殊语言,包括特定语言的语法分析器,解析为树状结构和中间状态代码(使用注册转换语言Register Transfer Language:RTL)。后台编译器提供与语言无关的解析和针对特定目标架构的创建结构。为了达到这个目标,最优化使用RTL创建更快速或者更简洁代码(如果可能,两者同时兼顾)。最优化的RTL被代码生成器获取,然后生成目标代码。



GCC 4的核心转换:

GCC 4 提供许多标准编译器组件的修改,最大更改是通过引进树静态单一分配(tree Static Single Assignment:SSA)格式对代码最优化的支持。GCC 4 对于 警告warning和错误error的展示是非常彻底的(事实上,一些特定的警告信息在GCC 4中已经显示为错误)。GCC 4的一个退步是它并不是GCC 3创建对象的字节编译,这意味着GCC 3编译的代码必须通过GCC 4重新编译。不幸的是,这样的成本就要增加。

让我们看看GCC 4 的主要进步。

4.0 发布系列:

4.0系列(4.0.4是最后版本),是GCC 进入 第4版的第一步,所以并不推荐使用在生产环境中,这个版本包含很多修改,一个是前面介绍的树静态单一分配SSA,另外一个是autovectorization自动矢量化。

在GCC 4之前,中间代码名叫Register Transfer Language (RTL),RTL是一个低层的代码,非常类似于汇编语言(从LISP S-expressions获得灵感)。RTL的问题是它对转换成最终目标提供了优化,确失了解释信息。当需要支持更好的分析和优化的时候,Tree SSA 设计用来同时独立于语言和目标。

Tree SSA 引入了两个新的中间代码,第一个叫 GENERIC ,这是一个普通的树结构,用来形成前台树格式。 GENERIC 树转换为 GIMPLE格式和子序列控制流图来支持基于SSA的最优化。最后SSA树转换为RTL,这用于后台来做最终目标的代码生成。简单的说,就是,引入Tree SSA的好处就是提供新的中间代码让高层和低层的最优化都做到最好。

GCC 4另外一个有趣的变化是添加了loop vectorizer 循环矢量(也是基于Tree SSA框架)。Autovectorization 自动矢量化让编译器标识代码内的分级进程循环,让目标处理器能够获得矢量指令的优势。结果是获得更加严格和高效的目标代码。另一个基于循环优化的是Swing Modulo Scheduling (SMS),通过减少构造层平行数量来构建最小循环指令管道。

最后 4.0 系列引入很多C 和 C++ 修改,新的Fortran 前台,支持Fortran 90 和 95 (而不是古老的Fortran 77,GCC 3支持)。新的Ada 2005功能,支持更多Ada新的架构。

4.1发布系列:

改进的属性支持和更精确的分支可能性预判。两个很有用的优化是更好的内联支持和减少本地指令缓存能力。如果函数是内联方式,编译器不再频繁执行。而且热点调用区域将更可能通过内联来保持代码数量尽可能小,获得内联函数的优势。GCC能够帮助分段函数进入热点或者冷静区域。保持热点函数放在一起,获得更好的指令缓存。

前台做了系列更新,包括支持Objective-C++。同时有大量针对java核心库(libgc)的更新。后台引入对IBM® System z™ 9-109 处理器支持,包括支持128位指令代码,Electronics Engineers (IEEE)浮点数,和内建原子内存存取能力。如果这些还不够吸引眼球,那么后台现在还能够发出保护堆栈攻击的指令,这意味着,如果缓冲buffer溢出被检测到,将重新排列保护指针不会崩溃。一些内建功能也被更新,用来保护缓冲buffer不会被过量请求占用。

4.2发布系列:

4.2版本继续支持更好的优化,同时包括语言和处理器架构的进步。后台更新包括对Sun的UltraSPARC T1处理器支持(代码名称Niagara),同时支持Broadcom的SB-1A MIPS 芯片。前台修补了C++可视化处理机制,支持Fortran 2003 输入/输出流扩展。但是4.2最有趣的更新是添加了C,C++和Fortran编译器的OpenMP功能。

OpenMP是一个多线程实现,允许编译器生成平行任务和数据代码。

OpenMP一个概念:代码能够通过区域注释,这块区域平行处理能够被处理器直接使用。代码转换成多线程程序,用来处理代码块存在,然后在代码块结束后进入每个线程。

下图提供了处理器如何工作的示例。



4.3发布系列:

这个发布系列显示功能和支持架构的加速进步 (比如很多陈旧的架构支持被删除)。新的语言支持,比如添加对Fortran 2003支持。新的处理器支持,包括支持Coldfire 处理器家族, IBM System z9 EC/BC 处理器,Cell broadband engine 晶格宽带引擎架构的互协作处理器单元(Synergistic Processor Unit :SPU),支持SmartMIPS等。你将发现Thumb2的编译和库支持(简洁的ARM指令)以及对ARMv7架构支持,支持 Core2 处理器和Geode处理器家族。

4.3 发布以后:

已经开始4.4版本开发了,这个版本即将发布,在4.4版本中OpenMP的3.0版本规格将应用到C, C++, 和 Fortran中。

编译器现在允许你定义一个在函数层进行优化的级别,(代替文档层,原先是缺省设置)。这个功能提供优化参数,提供独立的选项做优化。

最后处理器将添加Picochip支持,这是一个16位多核处理器。

GCC的未来?

GCC的未来是光明的。GCC将支持更多的处理器和架构,GCC几乎涵盖整个开发语言。开发方面还支持一系列不同的语言,比如Mercury,GHDL(一个用于VHDL的GCC前台语言),和 统一的并行C语言(Unified Parallel C language :UPC)。

由于GCC的进步,几乎所有的软件将从GCC的进步中获得好处(从Linux和Berkeley软件到Apache等),通过GCC 4进行软件编译将更加简洁和快速。

来自: ibm.com
6
0
评论 共 2 条 请登录后发表评论
2 楼 pi1ot 2008-11-07 17:29
c++09支持如何
1 楼 fivestarwy 2008-11-07 01:07
希望速度有所提高

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 如何发现安全漏洞

    如何发现安全漏洞by dspman 如果一个程序有错误,并且只在某些特殊的情况下面出现,它并不是什么大问题。通常,你能够避开这些特殊的情况,使得程序中的错误故障不会发生危害。你甚至可以按照你的意愿,在你的程序中加入这些小小的“臭虫”。但是,有时有些程序处于安全界限的边缘位置。他们从另外的程序作为输入,但不是按照程序本来的存取方法。我们常见的一些例子:你从的邮件阅读器读取任何人给你发的邮件,然后显示

  • 漏洞挖掘入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    希望这篇文章在可以帮助你解开一些对于漏洞挖掘的谜团。在学习和研究漏洞挖掘的过程中遇到困难并感到不知所措是很正常的。不过学习的过程就是这样,只有不断的去尝试才会进步。祝你在漏洞挖掘的路上走的越来越远。

  • 从怎么找漏洞到怎么挖漏洞!小白入门到精通,收藏这一篇就够了

    从怎么找漏洞到怎么挖漏洞!小白入门到精通,收藏这一篇就够了

  • 【精选】小白是如何挖漏洞的(技巧篇)

    更多渗透技能 ,10余本电子书及渗透工具包,搜公众号:白帽子左一 作者:掌控安全-山屿云 目录: 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结都有提供对应的案例,简直不要太nice! 这个月的SRC活动也快开始了,看到群里的小伙伴在问如何找漏洞,SQL注入的漏洞咋找,逻辑漏洞咋找,支付漏洞咋找,越权漏洞咋找,等等 其实这都一个道理,用谷歌语法,找通杀用fofa,这里演示几个类型的漏洞,其它的也是一个道理 第一个:SQL注入漏洞 AS:首先是SQL注入的,这个

  • 如何寻找安全漏洞之——黑客们如何挖掘漏洞

    看到本文的题目你会不会虎躯一震呢?感觉——it’s imposible!,but it is so easy to get in。。。 以前我们总是听到“挖掘漏洞”,“某某公司出现了提权漏洞”,我们会问一句“你咋知道这是漏洞?你怎么知道漏洞在哪?”,当然回答这个很简单啦,因为漏洞在代码中,但是上百万行的代码谁知道哪里有漏洞?这个嘛。。。人做不到软件可以搞定一切啊!当然漏洞挖掘的前提是你要懂得如何发

  • 教你怎么看一个网站是否存在漏洞!

    教你怎么看一个网站是否存在漏洞! 该隐藏帖已经发布超过30天,因此无需回复即可浏览!        教你怎么看一个网站是否存在漏洞!!!  漏洞  近来很多网站受到了各种各样形式的攻击,黑客攻击的动机各不一样,黑客人攻击的目标也有不确定性,作为一家企业的网管、或CEO您是否担心您的网站也遭受同样的命运呢?      什么样的站点容易被黑客入侵呢?      有人说,我做

  • 挖洞经验 | 看我如何发现雅虎网站的3个RCE漏洞

    今天我要分享的是,我参与雅虎(Yahoo)漏洞赏金项目发现的3个RCE漏洞。雅虎漏洞测试范围中涉及了很多服务应用,而我发现的漏洞就与雅虎的BrightRoll应用和中小企业服务相关。BrightRoll 是雅虎旗下的独立视频广告平台,可通过 Web、移动和连接电视吸引广泛受众。2014年,雅虎以6.4亿美元收购BrightRoll,此举旨在加...

  • 安全漏洞是如何被发现的?

    在解答“安全漏洞是如何被发现的?”这个问题之前,我们先要弄清楚一个概念“安全漏洞”是什么?安全漏洞是指软件、硬件或者系统的一种设计缺陷,使攻击者可以实现设计者预期意外的某些非法操作,进而达到破坏系统运行或者危害用户的目的。比如围墙下的狗洞做得太大,让小偷可以避开监控偷偷钻进来,这就是一个漏洞。但是缺陷并不一定是漏洞。还是刚刚这个狗洞,如果一开始做的太小了,过两年之后狗都长大了,不能钻过这个狗洞了,所以这个狗洞只好废弃,就不能称作漏洞了,只能说是一个“缺陷”如果一个缺陷只是影响系统运行,没有达到危害系统安全的

  • 漏洞检测的几种方法

    系统安全漏洞,也可以称为系统脆弱性,是指计算机系统在硬件、软件、协议的设计、具体实现以及系统安全策略上存在的缺陷和不足。系统脆弱性是相对系统安全而言的,从广义的角度来看,一切可能导致系统安全性受影响或破坏的因素都可以视为系统安全漏洞。安全漏洞的存在,使得非法用户可以利用这些漏洞获得某些系统权限,进而对系统执行非法操作,导致安全事件的发生。漏洞检测就是希望能够防患于未然,在漏洞被利用之前发现漏洞并修补漏洞。本文作者通过自己的实践,介绍了检测漏洞的几种方法。   漏洞检测可以分为对已知漏洞的检测和对未知漏洞的

  • 小白是如何挖漏洞的(技巧篇)入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    这时候就是要靠我们万能的 fofa 了,首先我们要知道有哪些 cms 有漏洞这里大家可以去找网上的漏洞库,里面一般都会有漏洞合集和这里我稍后会给大家推荐一两个看到没有,就是这么多cms,一杀一个准,上分必备漏洞当然很多漏洞都不能一步到位的,当然也有很多是可以给我们刷分的不过是否重复提交,这我就不太清楚了,可以给你们看看我的战果!当然,没审核,能重复几个我就不知道了,一切随缘—-这里随便找一个cms,给你们看看就这cms,信息泄露,你看,多香!,而且这个漏洞是直接把poc打上去就行了!

  • APP和小程序漏洞查找的方法

    目前小程序和APP安全这一块如何去做这个漏洞挖掘,然后漏洞挖掘的这么一个大概的思路是怎么样的,咱们接下来要讲的这个方法其实是通过抓包,包括说这个解包apk包,这一系列的方法去把它的这个 API或者说把它的数据包这个流量给获取到,然后通过这个层面就是流量层网络层来进行漏洞挖掘,因为你通过流量层和网络层进行漏洞挖掘的时候,你挖掘漏洞的方法就可以跟web安全里头的很多手法是一样的了,就可以减轻大家的难度,让大家更好的去挖掘这个安卓或者是苹果IOS系统或者小程序的这些漏洞。 但是这个肯定不是说所有的这个.

  • 简单查找漏洞

    1.http://120.24.86.145:8002/yanzhengma/ 随机数生成查找flag: 输入框内只允许输入1位数字,查看源代码,发现:,则在浏览器F12打开开发者模式,在查看器中修改“maxlength"的值,改为3,回车后输入验证码答案 , flag就出现了       2.http://120.24.86.145:9001/test/ 点击一百万次查找f...

  • 软件测试-如何快速发现Bug

    在高强度的测试工作中,如何快速、有效、准确的开展测试工作,总结。

  • 如何查找网站漏洞文件任意查看漏洞详情与利用

    在对网站程序代码的安全检测当中,网站文件任意查看漏洞在整个网站安全报告中属于比较高危的网站漏洞,一般网站里都会含有这种漏洞,尤其平台,商城,交互类的网站较多一些,像普通权限绕过漏洞,导致的就是可以查看到网站里的任何一个文件,甚至可以查看到网站的配置文件config.php conn.php等等。 我们SINE安全公司在对gitea开源程序代码进行网站安全检测的时候发现存在网站文件任意查看漏洞,没...

  • 【破解】常用的查找漏洞工具

    Pangolin(穿山甲)和Havij(胡萝卜) 稍后发布

  • 如何将你在公有云环境中的漏洞找出来?

    渗透测试可以帮助企业将他们在公有云环境中的漏洞找出来。但是针对AWS、谷歌和Azure的测试需求有什么不同呢? 很多企业IT部门使用云渗透测试来确定和解决他们在云计算环境中的潜在安全缺陷。但是,在公有云平台上执行一项渗透测试之前,理解你的云供应商的唯一测试需求很重要。 渗透测试模仿了实际的攻击,因此在执行之前要和云供应商进行协调。下面是在亚马逊Web服...

  • 如何寻找WEB程序漏洞,及如何利用和防范

    网络安全是一个非常流行的话题,不论是这方面的专家还是一个普通人,都或多或少涉及其中。在此环境下,入侵也变得前所未有的活跃。每个人都想成为这领域的高手。入侵分几个方面,现在以SQL注入和溢出最为流行。我在此浅谈一下SQL注入的相关问题。  其实SQL注入和溢出有异曲同工之妙,都是利用不按正常思维来达到入侵的目的。简单的说就是程序作者想得没有入侵者想得全面,不乏有些作者水平很高,但想投机取巧。SQL注

Global site tag (gtag.js) - Google Analytics