本文简单介绍如何在Ubuntu x86下编译并测试native GCC。
在编译GCC之前,先介绍一个概念——bootstrap。
bootstrap就是自己编译自己,或者说用GCC编译GCC本身。GCC的bootstrap分三个阶段,具体如下:
- 用系统提供的编译器编译GCC源代码,得到GCC编译器;
- 用步骤1得到的GCC编译同一份GCC源代码,又得到一套GCC编译器
- 用步骤2得到的GCC编译同一份GCC源代码,第三次得到一套GCC编译器
最后比较步骤2和步骤3得到的两套编译器是否相同,如果相同,则bootstrap成功;否则失败。
编译GCC,首先需要在系统里安装可用的编译器和相关的开发包,在本文中,我们使用Ubuntu预装的GCC作为编译器,来编译我们手上的GCC源代码。
sudo apt-get install build-essential bison flex libncurses5-dev \ texinfo gawk gettext libtool libgmp3-dev libmpfr-dev libmpc-dev
然后就是configure和make。由于默认情况下,编译出来的GCC支持多种语言,除了常见的C/C++之外,还有fortran、java和objc等等,因此整个编译过程耗时很长,通常可以只选择我们关心的语言,如C/C++。注:LTO(Link Time Optimization)并非是一种语言,而是编译C/C++程序的一种方式。
cd build ../gcc-src/configure --prefix=/home/liang/bin/gcc --enable-languages=c,c++,lto make -j 4 # 并行编译,参数根据具体环境选择
bootstrap对于开发GCC来说并不是必需的,使用如下命令,可以编译一份可调试的GCC,且只编译一次。
make STAGE1_CFLAGS='-g3 -O0' all-stage1
如果需要调试g++
(更准确地说,调试cc1plus
),那么使用如下configure
命令,make
命令同上。
../gcc-src/configure --prefix=/home/liang/bin/gcc --enable-stage1-languages=c,c++ \ --enable-languages=c,c++
bootstrap本身就是一个非常好的测试,因为GCC本身就是一个非常复杂的应用程序。另外,GCC源代码中还包含测试集,使用方法如下:
sudo apt-get install autogen cd build make check
或者
cd build/gcc make check-gcc # 测试C和C++ make check-g++ # 只测试C++