我的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,而不是从我放置它们的位置拾取。
当我想在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
@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/
首先,每个动态链接程序最重要的依赖项是链接器。所有这些库必须与链接器的版本相匹配。
让我们举一个简单的例子:我有一个newset ubuntu系统,在那里我运行一些程序(在我的情况下,它是D编译器- ldc2)。我想在旧的CentOS上运行它,但是由于旧的glibc库,这是不可能的。我得到了
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
我必须将所有依赖从ubuntu复制到centos。
正确的方法如下:
首先,让我们检查所有依赖项:
ldd ldc2-1.5.0-linux-x86_64/bin/ldc2
linux-vdso.so.1 => (0x00007ffebad3f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f965f597000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f965f378000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f965f15b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f965ef57000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f965ec01000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f965e9ea000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f965e60a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f965f79f000)
linux-vdso.so。1不是一个真正的库,我们不必关心它。
/ lib64 / ld - linux - x86 - 64.。2是链接器,Linux使用它将可执行文件与所有动态库链接起来。
其余的文件都是真正的库,所有这些文件和链接器都必须复制到centos中的某个地方。
让我们假设所有的库和链接器都在“/mylibs”目录下。
ld - linux - x86 - 64.。2 -我已经说过了-是连接器。它不是动态库,而是静态可执行文件。您可以运行它并查看它甚至有一些参数,例如library-path(我将返回它)。
在linux上,动态链接的程序可以只根据它的名字来发布
/bin/ldc2
Linux将这样的程序加载到RAM中,并检查为它设置了哪个链接器。通常,在64位系统上,它是/lib64/ld-linux-x86-64.so.2(在您的文件系统中,它是到实际可执行文件的符号链接)。
然后linux运行链接器并加载动态库。
你也可以稍微改变一下,这样做:
/mylibs/ld-linux-x86-64.so.2 /bin/ldc2
它是强迫linux使用特定链接器的方法。
现在我们可以回到前面提到的参数——library-path
/mylibs/ld-linux-x86-64.so.2 --library-path /mylibs /bin/ldc2
它将运行ldc2并从/mylibs加载动态库。
这是使用选择(不是系统默认)库调用可执行文件的方法。
当我想在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