获取GCC源代码

来源:互联网 发布:seo外包公司哪家好 编辑:程序博客网 时间:2024/06/06 01:21

3月22日,GCC 开发团队庆祝 GNU 编译器套裝(GNU Compiler Collection)25周年。当理查德·斯托曼在1987年宣布第一版 GCC 时,很少人会想到 GCC 如今能有这么广泛的影响。它塑造(prototype)了多种语言的特性(这些特性后来被采纳为它们各自语言标准的一部分),从“long long”类型到事务性内存。诸如Google、Facebook、金融市场和股票交易的这些GNU/Linux 生态系统,GCC 提供了用于其所需的基础架构的工具链。

我们赞赏并感谢无数开发人员的多年贡献,正因如此,才使 GCC 成为业内历史上持续时间最长、最成功的自由软件项目之一。

补充:其实 GCC 是由理查德·斯托曼在1985年开始做的。他首先扩增一个旧有的编译器,使其能编译C,这个编译器一开始是以 Pastel 语言所写的。Pastel 是一个不可移植的 Pascal 语言特殊版,这个编译器也只能编译 Pastel 语言。为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在 1987 年以 C 语言重写并成为 GNU 专案的编译器。GCC 的建立者由自由软件基金会直接管理。(维基百科)

Richard Matthew Stallman
我们准备了GCC 4.7.0的发布,作为一个特别礼物。最新版继承了自由软件行业标准编译器的一系列高品质。GCC 4.7.0 有重大更新,包含了之前版本没有的新功能。

GCC 4.7 在已选架构上支持软件事务性内存。 C++ 编译器支持 ISO C++ 新标准中的更大子,比如:支持原子(atomics)和 C++ 11内存模型、非静态的数据成员初始值设定项、用户自定义文字、别名申明、委派构造函数、explicit 重载和扩展的友元语法。C 编译器支持 ISO C 11 新标准中的更多特性。针对C、C++和Fortran,GCC 现在支持 OpenMP 3.1 版规范。

链接时优化 (LTO)框架在可扩展性、稳定性和资源需求方面都有改善。内联和进程间常量传递已得到改善。更多变更信息,请参见:http://gcc.gnu.org/gcc-4.7/changes.html
GCC logo
GCC 新发行版可从 GNU FTP服务器下载,子目录是 gcc/gcc-4.7.0/

 

获取GCC源代码  http://www.gnu.org/prep/ftp.html

使用以下任意方法均可获得gcc源代码:

\svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir (摘自http://gcc.gnu.org/svn.html)

git clone git://gcc.gnu.org/git/gcc.git(摘自http://gcc.gnu.org/git/?p=gcc.git;a=summary)

需要注意的是,第二种方法得到的代码并非是svn的所有历史镜像。因为gcc的svn分支不是全部位于svn://gcc.gnu.org/svn/gcc/branches/这一层,其中如redhat或者google等实

际起到名字空间的作用,再下一层才是真正的分支内容,然而svn到git转换的脚本不能识别这种情况,因此所有这类位于第二层的分支都不存在于git镜像中。

当然对于初学者来说并不重要,我们只要盯住一个版本看就好了,比如4.5.2或者4.4.5(原本想等4.6发布之后再开始这个学习系列,目前看来一半时是等不到了)。由于我之前

在4.4.5上有一点积累,因此如没有特别说明,这一系列的心得都是通过阅读4.4.5的代码而来。

使用源代码交叉索引工具
拿到源代码之后,建议使用代码交叉索引工具生成索引,方便阅读。常用的有etags(或者ctags)和cscope。

etags
gcc的Makefile里有生成TAGS文件的target,可以直接在编译目录下生成,如

 $ mkdir build $ cd build $ ../gcc/configure --enable-languages=c,c++,lto $ make $ make -k etags # OR `make -k tags'
在Emacs里加载TAGS文件的方法是:M-x visit-tags-table。

cscope
cscope的配置也不复杂,以下是在Ubuntu 10.10下安装配置步骤

 $ sudo apt-get install cscope cscope-el $ cd gcc $ gcc-cscope.sh
gcc-cscope.sh脚本内容如下

 #!/bin/bash BUILD_DIR=${1:-../build/gcc} cscope-files.sh libiberty gcc include gcc/config/arm $BUILD_DIR >cscope.files if [ -f cscope.files ] then cscope -b -q -k else echo "cscope.files not found at $PWD." exit 1 fi
由于gcc的部分代码是在编译期生成的,所以除了索引源代码目录下的文件,还要索引编译目录下的文件(对应于BUILD_DIR这个变量所制订的目录,缺省为build/gcc,也可以通过参数使用其它目录)。

由于gcc支持多种硬件平台,为避免混淆,我只选择了自己关心的ARM部分代码,其它后端代码忽略。

cscope-files.sh脚本内容如下:

 #!/bin/bash for dir in "$@" do find "$dir" -maxdepth 1 -iname "*.[hc]" -type f done
要想在Emacs里面使用cscope索引结果,需要安装cscope-el软件包,并把下面一行代码加入Emacs配置文件

 (require 'xcscope)
具体使用方法可以参见/usr/share/emacs/site-lisp/xcscope.el文件内的注释。

 

下载gcc源代码,编译通过,测试hello world之后,就可以开始认真阅读它的实现了。

通常我们阅读的源代码,是开发过程中某一时刻的快照,在特定情况下,我们不仅需要理解它的当前实现方式,还要了解它的发展过程和原因。这时,我们可以借助版本管理工具、ChangeLog文件和邮件列表,来了解开发历史。

取决于获取源代码的方式,可以使用的版本管理工具有subversion和git,熟练使用命令行工具或者图形化客户端是必须的,如果能和开发环境无缝结合就更完美了。Emacs默认的VC软件包支持多种版本管理工具,包括subversion和git。VC的操作对象是文件,如果想要了解整个项目的情况,可以安装psvn和magit。

ChangeLog是个很有趣的东西,我一度对它的作用不太理解。有了版本控制工具,还要ChangeLog做啥?!而且ChangeLog的内容也很枯燥,它只记录了源代码的物理变化,比如增加了一个变量,并在哪个函数里使用;删除一个宏;或者改变函数调用关系等等。它并不记录做出这些改变的目的或原因。后来经jzhang918介绍,终于明白它对于版本管理工具的补充作用。通常,版本工具的操作对象是文件,因此,如果想知道某个函数(或者某个变量)发生了哪些变化,则相当棘手,ChangeLog的作用便在于此。

仅有历史版本和ChangeLog还是不够的,它们缺少了一项非常重要的信息——为什么要做这样的修改。一般来说,最好能在提交日志上说明,但很少有gcc的开发者这么做,所以,就要靠邮件列表来帮忙了。通常来讲,在提交修改之前,都需要把patch发到gcc开发者所用的邮件列表上,供maintainer检查,通过后才能提交。在邮件里,作者会讲一点来龙去脉,不然maintainer一头雾水,patch就无法通过了。

============================================================================================

 

在网上,编译GCC的方法有很多,大部份人都推荐在CYGWIN环境下进行交叉编译,这样可以可以少遇到许多困难,但是使用CYGWIN时往往需要编译许多其它相关工具才行,对于我这个懒人来说,真是不太现实,所以我开始了我用MINGW编译之旅。

在国外似乎很早就有人开始用MINGW尝试编译GCC了,不过如你根据它的方法的话,依我试验后的经验不一定能够成功的编译出来,因为有许多提前工作,在那文档中并没有列出。下面将以GCC4.2.2为例进行

前期准备工作:

一、准备一个已编译好的GCC,我用的是TDM的GCC4.2.1(当然用它的GCC4.2.2也可以)

二、安装MSYS和它的工具包,在MSYS安装完成以后,一般会要求指定一下你的GCC安装路径,按要求填写即可,万一你想改变了你可以在MSYS文件夹中的 /etc/fstab下进行修改。最后要说的是你可能需要从MINGW的官网上下载最新MAKE和MAKEINFO这个两个程序,后面我将会给出为什么需要它们的原因

三、安装mingw-core、mingw-win32api、mingw-binutil

四、编译GMP与MPFR,根据测试GMP虽然有了4.2.2版本,但是在WIN环境下无法通过编译(有高人帮我解决更好了),但是GMP4.2.1依然可以编译使用,为编译 GCC4.2.2所以MPFR必需要求使用MPFR4.2.2,在msys环境下,老惯例的三步走configre,make,make install就可以了,将编译好的相关文件复制到GCC的文件夹中,当然你可以在GCC编译时另外指定路径,不过会变得麻烦些

五、安装GNUWIN32组件

bison into

http://gnuwin32.sourceforge.net/down...on-bin-zip.php

http://gnuwin32.sourceforge.net/down...on-dep-zip.php

flex

http://gnuwin32.sourceforge.net/down...ex-bin-zip.php

libtool

http://gnuwin32.sourceforge.net/down...ol-bin-zip.php

libiconv

http://gnuwin32.sourceforge.net/down...nv-bin-zip.php

http://gnuwin32.sourceforge.net/down...nv-dep-zip.php

下一步编译:

其实正常来说这一步可以忽略不说,但是我就是不理解为什么在WIN环境下会变得如此的复杂?

下面是我的configure执行脚本

#!/bin/sh

PATH=/f/GCC/bin:/f/msys/1.0/bin:$PATH

../../configure --prefix=/mingw --enable-languages=c,c++,fortran,objc,obj-c++,treelang,java --disable-nls --disable-werror --disable-win32-registry --enable-sjlj-exceptions --enable-threads=win32 --disable-libstdcxx-pch --enable-fully-dynamic-string --enable-libgomp --with-tune=generic --with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe --with-gcc --with-gnu-ld --with-gnu-as

注意--with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe 这两句是必须要的,否则在编译可能出现无法生成a.exe文件的错误,根据网上得出的资料是MSYS在文件映射方面,最好是使用UNIX下面的路径方式,如果使用DOS的路径方式很容易出现一些陌名的错误。还有如果你要编译GCC的大部份编译器,最好还是按照我上面的来写--enable-languages=c,c++,fortran,objc,obj-c++,treelang,java,因为有时候GCC配置无法正常识别你要编译的语言种类,另外GNAT自gcc4.2.0开始,我就一直没有成功过,一直提示缺少calander文件。

接着是make,心跳吧,在我的编译历程中,这里是最容易出现各种各样奇怪的错误的,一般来说有两个方面,一个是上述配置没有做好,存在一定问题,另一个就是编译用的源文件出现问题,我发现如果你使用WINRAR来解压GCC4.2.2的源文件时,会有一个长文件名的.h文件解压后文件名出错,导致无法编译通过,我推荐使用7-ZIP,这个在多次使用过程中没有出现任何问题。

最后一步是make install,很不幸的说,这里会存在一个问题,有时你会发现你安装一半会提示你,需要安装makeinfo和最新的make应用程序,如果你仔细观察一下你会发现GCC的CONFIGURE里面使用的是 missing makeinfo当然是不对的了,还好MINGW上已经提供了最的MSYS用MAKE和MAKEINFO,下载覆盖,然后修改GCC源文件根目录下的MAKEFILE和子文件夹GCC下的MAKEFILE,把里面的missing makeinfo替换为目录下的makeinfo就可以解决,同时不要使用mingw32-make那个程序,那个虽然是同MINGW GCC在一起,但是无法在MSYS中使用,否则会出现调用文件目录的错误,好了到了这一步,GCC4.2.2的编译全过程就结束了,希望大家用得愉快;

====================================================================================

 

1.下载MinGW

一种方法是到Sourceforge(http://sourceforge.net/project/showfiles.php?group_id=2435)

2.环境变量的配置

在(系统属性-->高级-->环境变量-->系统变量中)

a.在PATH的值中加入“C:\MinGW\bin”。

b.新建LIBRARY_PATH变量,在其值中加入“C:\MinGW\lib”。

c.新建C_INCLUDE_PATH变量,在其值中加入“C:\MinGW\include”。

 

 

 

原创粉丝点击