jan*_*ver 10 libraries centos software-installation not-root-user
我们的计算集群运行一个非常旧的 CentOS 版本,有一个旧的内核(2.6.18),当然还有旧的库和二进制文件。因为更新整个事情需要在所有节点上进行大量工作,所以这不是一个选项。
我正在尝试编译和使用一个需要C++11
更新版本gcc
(和/或clang
)的程序。因为我根本不想弄乱系统,所以我想在某些本地目录树中以非 root 用户身份执行此操作。
问题是,这gcc
需要一个glibc
比机器上存在的新的。因此,我需要保持一个独立的,新版本glibc
在我的本地lib/
所描述的树,可能是在这里。
我迷失的地方是,如何将本地库的路径“硬编码”为所有必需的二进制文件,即gcc
,g++
等等?将 LD_LIBRARY_PATH 设置为我的本地lib/
树会导致所有系统二进制文件不再工作(ELF file OS ABI invalid
),因为他们想使用我的新libm.so
/libc.so
尚未编译它们。
所以,把它包起来:什么是保持一个较新的,局部的开发堆栈(含适当的方式glibc
,gcc
并行等)旧系统没有乱搞的根源?
作为一个附带问题:当涉及到单独的glibc
. 对我来说,当我尝试执行任何系统二进制文件(如ls
)时,它会导致上述错误。怎么来的?我做错了什么还是这是预期的行为?
pet*_*rph 10
您基本上有三个选择:
在您的库周围使用一个包装器,它会进行LD_LIBRARY_PATH
适当的设置,然后执行所需的库 - 类似于:
#!/bin/sh
export LD_LIBRARY_PATH="path/goes/here"
exec "$@"
Run Code Online (Sandbox Code Playgroud)与-rpath
( -Wl,rpath
)链接,它将动态链接器的搜索路径添加到二进制文件中(另请参见SO 答案- 它还提到了包装器)。
你不会喜欢阅读这个:更新你的集群(注意“你的”的重点)。它必须有一天或另一天完成,那么为什么不今天呢。在大多数情况下,“不是一种选择”有点强。其他用户可能也有同样的问题。
至于有问题的旧二进制文件 - 二进制文件中嵌入了他们首选的动态链接器。旧的动态链接器不理解新的 ABI。尝试调用这样的二进制文件:path/to/your/ld-linux-<arch>.so binary
。
构建 GCC:您可以随时尝试CFLAGS
在 GCC 的构建环境中导出- 但我确信它们会得到传播。各种发行版的构建脚本可能会给您一些线索(例如:对于 openSUSE,请查看.spec 文件中的第 1880 行)。
归档时间: |
|
查看次数: |
8529 次 |
最近记录: |