我的linux (SLES-8)服务器目前有glibc-2.2.5-235,但我有一个程序不能在这个版本上工作,需要glibc-2.3.3。
是否可以在同一台主机上安装多个glibc ?
这是我在旧的glibc上运行程序时得到的错误:
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./myapp)
./myapp: /lib/i686/libpthread.so.0: version `GLIBC_2.3.2' not found (required by ./myapp)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libxerces-c.so.27)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
所以我创建了一个名为newglibc的新目录,并复制了以下文件:
libpthread.so.0
libm.so.6
libc.so.6
ld-2.3.3.so
ld-linux.so.2 -> ld-2.3.3.so
and
export LD_LIBRARY_PATH=newglibc:$LD_LIBRARY_PATH
但是我得到一个错误:
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libpthread.so.0)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by libstdc++.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libm.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./newglibc/libc.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libc.so.6)
因此,它们似乎仍然链接到/lib,而不是从我放置它们的位置拾取。
@msb给出了一个安全的解决方案。
我在CentOS 6.5的conda环境中导入tensorflow作为tf时遇到了这个问题,CentOS 6.5只有glibc-2.12。
ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by /home/
我想提供一些细节:
首先将glibc安装到主目录:
mkdir ~/glibc-install; cd ~/glibc-install
wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
tar -zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build
cd build
../configure --prefix=/home/myself/opt/glibc-2.17 # <-- where you install new glibc
make -j<number of CPU Cores> # You can find your <number of CPU Cores> by using **nproc** command
make install
其次,按照同样的方法安装patchelf;
第三,给你的Python打补丁:
[myself@nfkd ~]$ patchelf --set-interpreter /home/myself/opt/glibc-2.17/lib/ld-linux-x86-64.so.2 --set-rpath /home/myself/opt/glibc-2.17/lib/ /home/myself/miniconda3/envs/tensorflow/bin/python
正如@msb提到的
现在我可以在CentOS 6.5中使用tensorflow-2.0 alpha。
裁判:https://serverkurma.com/linux/how-to-update-glibc-newer-version-on-centos-6-x/
当我想在Ubuntu precise (glibc-2.15)上运行chromium浏览器时,我得到了
(典型的)消息“…libc.so。6:版本' GLIBC_2.19'未找到…"
我考虑了这样一个事实,即文件不是永久需要的,而只是在开始时需要。
因此,我收集了浏览器和sudo所需的文件,并创建了一个mini-glibc-2.19-
环境,启动浏览器,然后将原始文件复制回来
一次。所需的文件在RAM中,原始的glibc是相同的。
as root
the files (*-2.15.so) already exist
Mkdir -p /glibc-2.19/i386-linux-gnu
/glibc-2.19/ld-linux.so.2 -> /glibc-2.19/i386-linux-gnu/ld-2.19.so
/glibc-2.19/i386-linux-gnu/libc.so.6 -> libc-2.19.so
/glibc-2.19/i386-linux-gnu/libdl.so.2 -> libdl-2.19.so
/glibc-2.19/i386-linux-gnu/libpthread.so.0 -> libpthread-2.19.so
Mkdir -p /glibc-2.15/i386-linux-gnu
/glibc-2.15/ld-linux.so.2 -> (/glibc-2.15/i386-linux-gnu/ld-2.15.so)
/glibc-2.15/i386-linux-gnu/libc.so.6 -> (libc-2.15.so)
/glibc-2.15/i386-linux-gnu/libdl.so.2 -> (libdl-2.15.so)
/glibc-2.15/i386-linux-gnu/libpthread.so.0 -> (libpthread-2.15.so)
运行浏览器的脚本:
#!/bin/sh
sudo cp -r /glibc-2.19/* /lib
/path/to/the/browser &
sleep 1
sudo cp -r /glibc-2.15/* /lib
sudo rm -r /lib/i386-linux-gnu/*-2.19.so
在同一个系统上有多个glibc版本是很可能的(我们每天都这样做)。
但是,您需要知道glibc包含许多必须匹配的部分(200多个共享库)。其中一个是ld-linux.so。2,它必须匹配lib .so。6,否则你会看到你所看到的错误。
linux.so的绝对路径。2是在链接时硬编码到可执行文件中,并且在链接完成后不能轻易更改(更新:可以用patchelf完成;请看下面的答案)。
要构建一个可以与新的glibc一起工作的可执行文件,请执行以下操作:
g++ main.o -o myapp ... \
-Wl,--rpath=/path/to/newglibc \
-Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2
-rpath linker选项将使运行时加载器搜索/path/to/newglibc中的库(因此您不必在运行它之前设置LD_LIBRARY_PATH),而-dynamic-linker选项将“烤”路径以纠正ld-linux.so。2 .进入应用。
如果不能重新链接myapp应用程序(例如,因为它是第三方二进制文件),并不是全部都丢失了,但它会变得更棘手。一种解决方案是为它设置适当的chroot环境。另一种可能是使用rtldi和二进制编辑器。更新:或者你可以使用patchelf。