Glibc编译过程总结

2025-11-03 04:16:18

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

然后输入: ld –lgcc_s –verbose

表示找到了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