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 | mkdir b |
这个编译过程有点慢,但是 GCC 不支持 distcc 的分布式编译。
编译 GLIBC
可以通过下面的命令来检查 GLIBC 的版本。
1 | locate libc.a |
我编译的是 2.30 版本,源码同样是在 Git 上拉下来
1 | git clone git://sourceware.org/git/glibc.git |
GLIBC 有一系列的依赖,在 configure 的时候能够看出来,这里列出我手动编译的,需要在编译好后,设置对应的环境变量:
make
1
export MAKE=/data/gcc-comp/make-4.1/b/out/bin/make
GCC
1
export CC=/data/gcc-comp/gcc-9.3.0/b/out/bin/gcc
AS/LD
这个都是 binutil 里面的组件,所以稍微不同地,是使用 configure with 参数的方式设置BISON
1
export BISON=/data/gcc-comp/bison-2.7/b/out/bin/bison
Python
虽然 configure 中提到 Python2 也是可以的,但我试了下还是有问题,所以不如直接编译一个 Python31
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 | export CMAKE_PREFIX_PATH="..." |