单个主机上有多个glibc库
我的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)
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个名为newglibc的新目录,并将以下文件复制到:
libpthread.so.0
libm.so.6
libc.so.6
ld-2.3.3.so
ld-linux.so.2 -> ld-2.3.3.so
Run Code Online (Sandbox Code Playgroud)
和
export LD_LIBRARY_PATH=newglibc:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
./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: …Run Code Online (Sandbox Code Playgroud) features.h标题的目的是什么?为什么以及何时可以在我的代码中使用它?
它是否定义了系统支持的源功能?或者它是否定义了一些必须根据其他定义定义的其他内容?
确定预编译二进制文件的依赖项(特别是关于 glibc 和 libstdc++ 符号和版本)然后确保目标系统安装了这些依赖项的最佳方法是什么?
我有一个限制,我不能提供在每台机器上编译的源代码(雇主限制),所以“在每台机器上编译以确保兼容性”的实际响应是不合适的。我也不希望提供静态编译的二进制文件 -> 似乎是使用锤子打开鸡蛋的情况。
我已经考虑了许多方法,这些方法大致围绕确定我的可执行文件/库需要的符号/库通过使用诸如ldd -v </path/executable>
or
之类的命令
objdump -x </path/executable> | grep UND
,然后以某种方式在目标系统上运行命令以检查是否提供了此类符号、库和版本(不完全确定我如何执行此步骤?)。然后将跟随一些模式或符号匹配以确保存在正确的版本或更高版本。
也就是说,我觉得这已经在很大程度上为我完成了,我正在遭受......“知识差距?” 它目前是如何实施的。
关于如何进行的任何想法/建议?
我应该补充一点,这是为了在各种 linux 发行版上安装我的软件 - 特别是定制的集群 - 可能不遵守发行指南或标准化的打包方法。目标是无缝安装。