我的 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
并且没有从我放置它们的地方拾取。
同一个系统上很可能有多个版本的 glibc(我们每天都这样做)。
但是,您需要知道 glibc 由许多部分(200 多个共享库)组成,所有部分都必须匹配。其中之一是 ld-linux.so.2,它must匹配 libc.so.6,否则您将看到所看到的错误。
ld-linux.so.2 的绝对路径在链接时被硬编码到可执行文件中,并且在链接完成后不能轻易更改(更新:可以使用patchelf http://nixos.org/patchelf.html; see 这个答案 https://stackoverflow.com/a/44710599/50617 below).
要构建可与新 glibc 一起使用的可执行文件,请执行以下操作:
g++ main.o -o myapp ... \
-Wl,--rpath=/path/to/newglibc \
-Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2
The -rpath
链接器选项将使运行时加载器搜索库/path/to/newglibc
(所以你不必设置LD_LIBRARY_PATH
在运行之前),以及-dynamic-linker
选项将“烘焙”路径以纠正ld-linux.so.2
进入应用程序。
如果您无法重新链接myapp
应用程序(例如,因为它是第三方二进制文件),并非全部都会丢失,但会变得更加棘手。一种解决方案是设置适当的chroot
它的环境。另一种可能性是使用rtldi http://bitwagon.com/rtldi/rtldi.html and a 二进制编辑器 http://en.wikipedia.org/wiki/Binary_editor.
Update:或者你可以使用patchelf http://nixos.org/patchelf.html现有的二进制文件将它们重定向到备用 libc。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)