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