如何在 Linux 上以非 root 用户身份维护一个单独的(较新的)glibc / gcc / ... 堆栈

jan*_*ver 10 libraries centos software-installation not-root-user

我们的计算集群运行一个非常旧的 CentOS 版本,有一个旧的内核(2.6.18),当然还有旧的库和二进制文件。因为更新整个事情需要在所有节点上进行大量工作,所以这不是一个选项。

我正在尝试编译和使用一个需要C++11更新版本gcc(和/或clang)的程序。因为我根本不想弄乱系统,所以我想在某些本地目录树中以非 root 用户身份执行此操作。

问题是,这gcc需要一个glibc比机器上存在的新的。因此,我需要保持一个独立的,新版本glibc在我的本地lib/所描述的树,可能是在这里

我迷失的地方是,如何将本地库的路径“硬编码”为所有必需的二进制文件,即gccg++等等?将 LD_LIBRARY_PATH 设置为我的本地lib/树会导致所有系统二进制文件不再工作(ELF file OS ABI invalid),因为他们想使用我的新libm.so/libc.so尚未编译它们。

所以,把它包起来:什么是保持一个较新的,局部的开发堆栈(含适当的方式glibcgcc并行等)旧系统没有乱搞的根源?

作为一个附带问题:当涉及到单独的glibc. 对我来说,当我尝试执行任何系统二进制文件(如ls)时,它会导致上述错误。怎么来的?我做错了什么还是这是预期的行为?

pet*_*rph 10

您基本上有三个选择:

  1. 在您的库周围使用一个包装器,它会进行LD_LIBRARY_PATH适当的设置,然后执行所需的库 - 类似于:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
    Run Code Online (Sandbox Code Playgroud)
  2. -rpath( -Wl,rpath)链接,它将动态链接器的搜索路径添加到二进制文件中(另请参见SO 答案- 它还提到了包装器)。

  3. 你不会喜欢阅读这个:更新你的集群(注意“你的”的重点)。它必须有一天或另一天完成,那么为什么不今天呢。在大多数情况下,“不是一种选择”有点强。其他用户可能也有同样的问题。

至于有问题的旧二进制文件 - 二进制文件中嵌入了他们首选的动态链接器。旧的动态链接器不理解新的 ABI。尝试调用这样的二进制文件:path/to/your/ld-linux-<arch>.so binary

构建 GCC:您可以随时尝试CFLAGS在 GCC 的构建环境中导出- 但我确信它们会得到传播。各种发行版的构建脚本可能会给您一些线索(例如:对于 openSUSE,请查看.spec 文件中的第 1880 行)。