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 版本号。

使用自己编译的环境

1
2
3
4
5
6
7
8
9
10
11
12
export CMAKE_PREFIX_PATH="..."
export CMAKE="..."
export LD_LIBRARY_PATH="..."
export LIBRARY_PATH="..."
export CPLUS_INCLUDE_PATH="..."
export AR="..."
export OBJCOPY="..."
export AS="..."
export CXX="..."
export CC="..."
export LD="..."
export CXXSTDLIB="..."