获取GCC源代码
阅读源代码的第一步是获取源代码,巧妇难为无米之炊嘛!
使用以下任意方法均可获得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
文件内的注释。
make -k etags # OR `make -k tags’
这条命令不work,make: *** 没有规则可以创建目标“etags”.
是我的gcc 版本下载的不对?
你是在根目录下吗?在gcc目录下确实是不行的。
$ mkdir build
$ cd build
$ ../gcc/configure –enable-languages=c,c++,lto
$ make -k etags # OR `make -k tags’
根据你的命令,我就是在build目录下执行 `make -k tags’ 这条命令的~~
那应该没有问题,你可以检查Makfile文件里面是否有一行
etags tags: TAGS
我是用gcc 4.4测试的。还有,make tags之前要先make,不然会出错。
build/Makefile中没有 etags tags: TAGS
在../Makefile.in有这句话
另外我这里make的时候出错,错误信息为: make: *** 没有规则可以创建“build/genconstants”需要的目标“../build-x86_64-unknown-linux-gnu/libiberty/libiberty.a”。 停止。
是不是configure的时候,没有检测出我的linux内核版本号?
没遇到过这种错误,好像你的错误信息都是没有target之类的,比较奇怪。你是哪个版本的gcc啊,从哪里下载的?
用的是 svn checkout svn://gcc.gnu.org/svn/gcc/trunk 这里的
我重新来一次
trunk处于不稳定状态是有可能,要么你试一试release branch,比如4.5或者4.4的。