问题
如果你在用一个很老的系统,你可能遇到:
clang: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by clang)
Glibc 一般是由系统底层来维护的,要运行必须升级系统。
但!是!服务器是公用的集群,没有root,升级不了。
尝试
于是尝试逆天改命装第二个 glibc:
第一步:
wget http://mirrors.ustc.edu.cn/gnu/libc/glibc-2.39.tar.gz
tar -xvzf glibc-2.39.tar.gz
cd glibc-2.39
mkdir build
cd build
../configure --prefix="$HOME/opt/glibc/2.39"
make -j 16
make -j 16 install
然后你 90% 概率会遇到以下错误之一:
These critical programs are missing or too old: make
需要使用新版 make. 自行编译 / 安装
…/sysdeps/x86_64/multiarch/memchr-evex-base.S:229: Error: no such instruction: vpcmpneqb (64 * 4)(%rdi),%zmm17,%k1’
binutils版本不匹配,需要和glibc版本相同,然后修改PATH使运行ld调用的是这个版本的binutils中的ld:
wget http://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.gz
tar -xvzf binutils-2.39.tar.gz
cd binutils-2.39
mkdir build
cd build
../configure --prefix="$HOME/opt/binutils/2.39"
make -j 16
make -j 16 install
makeinfo 相关错误:
没有安装 texinfo, 安装编译后 $PATH 指向 bin 解决
运行
装好后,需要修改你要运行的程序:
第一步,将编译器移出:
mv $HOME/opt/glibc/2.39/lib/ld-linux-x86-64.so.2 $HOME/opt/glibc/2.39/ld-linux-x86-64.so.2
第二步,安装 patchelf(推荐用 spack 安装)
spack install patchelf
spack load patchelf
第三步,修改程序
patchelf --print-rpath xxx
# 如果没有 RPATH
patchelf --set-rpath $HOME/opt/glibc/2.39/lib xxx
# 如果有 RPATH
patchelf --set-rpath $HOME/opt/glibc/2.39/lib:/original/rpath xxx
# 设置解析器
patchelf --set-interpreter $HOME/opt/glibc/2.39/ld-linux-x86-64.so.2 xxx
第四步,尝试运行
xxx
如果此时提示库找不到,但是实际上在系统库中,说明系统库路径没有注册到新的 glibc中:
# 增加系统目录
echo "/lib64" > $HOME/opt/glibc/2.39/etc/ld.so.conf
$HOME/opt/glibc/2.39/sbin/ldconfig -f $HOME/opt/glibc/2.39/etc/ld.so.conf -C $HOME/opt/glibc/2.39/etc/ld.so.cache
# 检查已注册的系统库路径
$HOME/opt/glibc/2.39/sbin/ldconfig -p
简单记录以供各位需要改名的朋友们参考。

