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
4mkdir 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
2locate libc.a
strings /usr/lib/libc.so.6 | grep GLIBC_
我编译的是2.30版本,源码同样是在Git上拉下来1
2git clone git://sourceware.org/git/glibc.git
git checkout release/2.30/master
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版本号。