Glibc编译过程
一、 下载代码
a) 下载代码
在http://ftp.gnu.org/gnu/glibc/下下载指定版本,先试试glibc-2.3版本
wget http://ftp.gnu.org/gnu/glibc/glibc-2.3.tar.gz
b) 解压文件
gzip –d glibc-2.3.tar.gz
tar –xvf glibc-2.3.tar
二、 配置
mkdir build_dir
mkdir target
cd build_dir
../glibc-2.3/configure --prefix=/media/xiaoshixiu/glibc/glibc_2_3/target/
a) 此时报错*** These critical programs are missing or too old: gcc make
因此先解决gcc版本问题
先查看glibc-2.3 /INSTALL文件
可以看到要求make版本为3.79以上,gcc版本为3.2版本以上,但是我本地gcc版本为5.4,比要求新但是还是无法编译,所以可能是我本地的版本太新了。
b) 降低gcc版本
用过多种方法,包括下载源码编译,都太复杂且会遇到其他问题。但是使用这个方法(https://www.cnblogs.com/Pan-xi-yi/p/12044608.html)可以成功降低gcc版本号
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/gcc-3.4_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i gcc-3.4_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/cpp-3.4_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i cpp-3.4_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/g++-3.4_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i g++-3.4_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/g77-3.4_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i g77-3.4_3.4.6-6ubuntu3_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/libg2c0-dev_3.4.6-6ubuntu3_amd64.deb
sudo dpkg --force-depends -i libg2c0-dev_3.4.6-6ubuntu3_amd64.deb
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.4 30
继续使用上面的configure命令,输出如下
表示gcc版本没问题了。
c) 设置gcc配置
随便运行gcc发现找不到crt1.o
因此需要指定编译期间指定文件位置,通过find命令查找crt1.o位置
vim ~/.bashrc
结尾添加如下语句
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LIBRARY_PATH
提示找不到gcc_s
输入:ld –lgcc_s –verbose
表示在ld上述路径中寻找libgcc_s.so但是找不到
然后输入:locate libgcc_s.so
表示在上述路径中找到libgcc_s.so,但是libgcc_s.so也是链接,libgcc_s.so.1才是实际文件,所以需要我们自己创建一个软链接
sudo ln -s /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/libgcc_s.so
表示添加成功
d) 降低make版本
下载make-3.79版本
wget http://ftp.gnu.org/gnu/make/make-3.79.tar.gz
tar –zxvf make-3.79.tar.gz
cd make-3.79
./configure –prefix=/usr/locat/make_3_79
make
make install
export PATH=/usr/locat/make_3_79/bin:$PATH
e) 之后对glibc进行configure
提示:
glibc the available kernel headers are older
,可以忽略直接进行编译。
三、 编译
a) 编译失败
强行编译提示:
gcc must provide the
主要原因是glibc对kernel header有要求,具体可以参考https://www.cnblogs.com/dyllove98/archive/2013/07/20/3202824.html,我本地安装的ubuntu16.04版本如下:
头文件版本可以查看include/linux/version
可以看到头文件版本号和内核版本号相同4.15.0
查看Glibc-2.3/INSTALL
这里其实很难理解,明明说是只要内核头文件大于2.3.99就行,但是我本地就是编译不过,怀疑是内核版本太高的缘故,解决办法要么降低内核版本,要么升高glibc版本,由于我这边编译机版本不好修改,因此增加glibc版本号进行编译。
四、 换GLIBC-2.16版本编译
a) glibc .dyn leaves prerequisite pattern empty
configure成功后进行make编译,出现下面错误
参考https://stackoverflow.com/questions/22261970/error-during-compilation-of-gnu-c-library-glibc
意思是make版本太低了,于是下载3.82
下载make-3.82版本
wget http://ftp.gnu.org/gnu/make/make-3.82.tar.gz
tar –zxvf make-3. 82.tar.gz
cd make-3. 82
./configure –prefix=/usr/locat/make_3_82
make
make install
export PATH=/usr/locat/make_3_82/bin:$PATH
b) 重新编译
make
make install
五、 总结
要编译Glibc,就要注意编译机内核版本(内核头文件版本),GCC版本,make版本,ld版本。
Glibc-2.16可以顺利编译通过的编译环境如下:
操作系统:ubuntu16.04
内核版本:4.15.0
GCC版本:5.4.0
Make版本:3.82
LD版本:2.26.1