GCC源代码阅读(一)

获取GCC源代码

阅读源代码的第一步是获取源代码,巧妇难为无米之炊嘛!

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

  1. svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir (摘自http://gcc.gnu.org/svn.html
  2. 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文件内的注释。

9 thoughts on “GCC源代码阅读(一)

  1. ryan says:

    make -k etags # OR `make -k tags’
    这条命令不work,make: *** 没有规则可以创建目标“etags”.

    是我的gcc 版本下载的不对?

  2. ryan says:

    $ mkdir build
    $ cd build
    $ ../gcc/configure –enable-languages=c,c++,lto
    $ make -k etags # OR `make -k tags’

    根据你的命令,我就是在build目录下执行 `make -k tags’ 这条命令的~~

  3. netcasper says:

    那应该没有问题,你可以检查Makfile文件里面是否有一行

    etags tags: TAGS

    我是用gcc 4.4测试的。还有,make tags之前要先make,不然会出错。

  4. ryan says:

    build/Makefile中没有 etags tags: TAGS
    在../Makefile.in有这句话
    另外我这里make的时候出错,错误信息为: make: *** 没有规则可以创建“build/genconstants”需要的目标“../build-x86_64-unknown-linux-gnu/libiberty/libiberty.a”。 停止。

    是不是configure的时候,没有检测出我的linux内核版本号?

  5. netcasper says:

    没遇到过这种错误,好像你的错误信息都是没有target之类的,比较奇怪。你是哪个版本的gcc啊,从哪里下载的?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据