linux - 单个主机上的多个 glibc 库

我的 linux (SLES-8) 服务器目前有 glibc-2.2.5-235,但我有一个程序不能在这个版本上运行并且需要 glibc-2.3.3。

是否可以在同一主机上安装多个 glibcs​​?

这是我在旧 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

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 并且没有从我放置它们的位置获取。

最佳答案

很可能在同一个系统上有多个版本的 glibc(我们每天都这样做)。

但是,您需要知道 glibc 由许多必须匹配的部分(200 多个共享库)组成。其中之一是 ld-linux.so.2,它必须与 libc.so.6 匹配,否则您将看到您所看到的错误。

ld-linux.so.2 的绝对路径在链接时被硬编码到可执行文件中,并且在链接完成后无法轻易更改(更新:可以使用 patchelf 完成;参见下面的 this answer)。

要构建一个适用于新 glibc 的可执行文件,请执行以下操作:

g++ main.o -o myapp ... \
   -Wl,--rpath=/path/to/newglibc \
   -Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2

-rpath 链接器选项将使运行时加载程序在 /path/to/newglibc 中搜索库(因此您不必设置 LD_LIBRARY_PATH 在运行它之前),并且 -dynamic-linker 选项将“烘焙”路径以将 ld-linux.so.2 更正到应用程序中。

如果您无法重新链接 myapp 应用程序(例如,因为它是第三方二进制文件),并非所有内容都会丢失,但它会变得更加棘手。一种解决方案是为其设置适当的 chroot 环境。另一种可能性是使用 rtldi 和 binary editor 。更新:或者你可以使用 patchelf 。

https://stackoverflow.com/questions/847179/

相关文章:

mysql - 错误 1045 (28000) : Access denied for user '

linux - Bash中的 'eval'命令及其典型用途

python - 如果对象存在,我如何获取它,或者如果它在 Django 中不存在,我如何获取它?

python - scikit-learn 中跨多个列的标签编码

linux - 查看 PS 命令的完整输出

linux - 如何在 Linux 中遍历目录?

python - 如何检查我的 python 对象是否为数字?

linux - 如何在 bash 中在一行中运行多个后台命令?

python - 如何将 numpy 数组转换为(并显示)图像?

python - 如何消除数独方 block 中的凸性缺陷?