GCC和GLIBC编译

GCC是C和C++的编译器,GLIBC是C库,两个是不同的Repo。编译顺序是先GCC在GLIBC,这是因为编译GLIBC时对GCC的版本有要求。

编译GCC

源码在Git上可以拉下来,然后checkout到自己想要的版本

1
git clone git://gcc.gnu.org/git/gcc.git

需要先安装依赖,其顺序为:gmp mpfr mpc。可以通过运行下面的命令来下载这些依赖

1
./contrib/download_prerequisites

我的机器上的gmp的版本是够的,所以我只编译了后面两个,最终编译GCC的命令是

1
2
3
4
mkdir b
cd b
../configure --enable-languages=c,c++ --with-mpc=/data/gcc-comp/mpc-1.0.3/out/ --with-mpfr=/data/gcc-comp/mpfr-3.1.4/out/ --prefix="$(pwd)/out"
make -j5

这个编译过程有点慢,但是GCC不支持distcc的分布式编译。

编译GLIBC

可以通过下面的命令来检查GLIBC的版本。

1
2
locate libc.a
strings /usr/lib/libc.so.6 | grep GLIBC_

我编译的是2.30版本,源码同样是在Git上拉下来

1
2
git clone git://sourceware.org/git/glibc.git
git checkout release/2.30/master

GLIBC有一系列的依赖,在configure的时候能够看出来,这里列出我手动编译的,需要在编译好后,设置对应的环境变量:

  1. make

    1
    export MAKE=/data/gcc-comp/make-4.1/b/out/bin/make
  2. GCC

    1
    export CC=/data/gcc-comp/gcc-9.3.0/b/out/bin/gcc
  3. AS/LD
    这个都是binutil里面的组件,所以稍微不同地,是使用configure with参数的方式设置

  4. BISON

    1
    export BISON=/data/gcc-comp/bison-2.7/b/out/bin/bison
  5. Python
    虽然configure中提到Python2也是可以的,但我试了下还是有问题,所以不如直接编译一个Python3

    1
    export PYTHON_PROG=/data/gcc-comp/cpython/b/out/bin/python3

最终configure如下

1
../configure --prefix=/data/gcc-comp/glibc/b/out --with-binutils=/data/gcc-comp/binutils-2.32/b/out/bin

注意,在这些依赖之后,GLIBC对Linux系统本身也有依赖,例如下面的错误来自于Linux kernel header版本的问题。

1
checking installed Linux kernel header files... missing or too old!

检查/usr/include/linux/version.h,将LINUX_VERSION_CODE转成16进制,然后按照两位两位分成三段,从左到右就是这个Lineux Header的Major/Minor/Patch版本号。