在 RHEL5.7 中更改 ld-linux-x86-64.so.2 的版本

在 RHEL5.7 中更改 ld-linux-x86-64.so.2 的版本

我正在尝试使用与 /lib64 中的 ld-linux-x86-64.so.2 不兼容的共享库。我没有 root 访问权限,因此无法更改 /lib64 中的文件。有没有办法让我的 RHEL5.7 机器使用不同的 ld-linux-x86-64.so.2?我尝试将需要使用的版本的路径放在 $LD_LIBRARY_PATH 中,但在那里被忽略了。

我有一个可执行文件,它与一些共享库一起打包。该可执行文件主要与机器上已有的库一起工作,但偶尔会崩溃并指向我从 /lib 使用的库之一。当我将可执行文件附带的一些库添加到我的 LD_LIBRARY_PATH 时,它会导致简单命令(如“ls”、“cp”、“ldd”)出现分段错误。该可执行文件还附带了 ld-linux-x86-64.so.2 的一个版本,当我运行命令 ./ld-linux-x86-64.so.2 --list libc.so(或导致命令中断的其他库)时,它不会导致分段错误。我希望能够使用软件随附的 ld-linux-x86-64.so.2 进行测试,以确保它解决了问题(并且不会导致其他问题),然后再联系 IT 部门并让他们更改我们将在其上运行该软件的所有机器。或者,如果可能的话,将解决方法构建到我的工作脚本中,这样我就不必经历整个变更请求过程。

当我尝试执行以下命令时,包含的 libc.so 与 ld-linux.so 无法很好地配合的一个症状是。 cp:重定位错误:libc.so.6:符号 _dl_tls_get_addr_soft,版本 GLIBC_PRIVATE 未在文件 ld-linux-x86-64.so.2 中定义,并带有链接时间参考 我是唯一一个使用我的机器的人,但是我的公司不会向用户提供 root 访问权限,因为网络设置的方式是,如果你在一个 Linux 机器上拥有 root 权限,那么你就在所有机器上都拥有了 root 权限。

答案1

对于这个“答案”很抱歉,我试图将其放在对你的问题的评论中,但间距和格式有限。

ld-linux-x86-64.so.2 是操作系统的核心部分。它实际上运行每个(64 位)动态应用程序。它不是一个库,而是一个应用程序本身,是一个在运行应用程序时调用的处理程序。

基本上,当您运行动态应用程序时,内核首先运行 ld-linux.so(或与您的位大小、发行版等相关的任何名称)。然后,ld-linux.so 会查看您的应用程序,查看您需要的库,查看库的任何硬编码路径(例如 rpath),检查 LD_LIBRARY_PATH,然后查找所有这些库,确保它们与位大小、名称等相匹配。然后,它会收集所有这些,加载它们,并运行您的应用程序。如果找不到库,它就不会运行您的应用程序。

ld-linux.so 不会受到 LD_LIBRARY_PATH 的影响,因为它是由内核运行的,而内核不会像 ld-linux.so 那样加载库,它只会加载配置为运行的库。同样,它不是库,因此不要使用库语义 (LD_LIBRARY_PATH) 来更改它的调用方式。它确实有影响其运行的环境变量 - 请参阅man ld-linux.so详细信息(除了 LD_LIBRARY_PATH,LD_PRELOAD 也非常有用)。

我很想知道你的问题是什么。没有冒犯的意思,但这似乎是一个XY问题.这又是一个操作系统部分。如果它坏了,你的操作系统也会坏掉。如果你想把它换掉,你可能会影响(: 严重破坏)系统的其余部分。由于您没有 root 权限,我认为您不是唯一一个使用该计算机的人,而且您会激怒一些人。:)

你想做什么?

答案2

添加另一个答案,因为另一个答案无论如何都更像是演讲/咆哮。

看来您遇到的不是 ld-linux.so 问题,而更可能是简单的库不匹配问题。可能是版本问题 - RHEL 5 不再是当前的 RHEL 版本,因此不再是最先进的,尤其是 glibc 在各个版本中都存在问题。

我会用一个简单的 shell 脚本包装您的可执行文件,该脚本会为您的特殊库设置 LD_LIBRARY_PATH,然后执行您的应用程序。这样,您的其他应用程序(ls、cs 等)就不会受到这些新库的影响。如果有帮助的话,您甚至可以在脚本中使用新的 ld-linux.so 在脚本中运行您的应用程序。我认为不行,但您可以测试它。这样,所有内容都与脚本、新的可执行文件和随附的特定库隔离。

答案3

ld-linux.so是一个库加载器,它是的一部分libc,因此使用的ls-linux.solibc6.so需要相互兼容。

ld-linux.so当二进制文件启动时,将调用主机来使用rpathLD_LIBRARY_PATH环境等加载所有依赖的库。通常它将libc6.so从系统中加载并且一切正常。

但是,如果软件自行发布libc6.so并且系统ld-linux.so加载它,并且它们不兼容,那么就会发生崩溃。

一种解决方法是将您自己的ld-linux.so所有必需的库连同一起发送libc6.so,然后通过您的自定义执行二进制文件ld-linux.so

./ld-linux.so mybinary

二进制文件也应该与之链接-Wl,rpath=$ORIGIN(或类似),以便ld-linux.so在二进制文件旁边的目录中查找库(否则它可能会开始在主机的库中查找,这些库将加载系统libc6.so,然后它可能会由于外来而崩溃ld-linux.so)。

可以使用以下命令检查库依赖关系,ldd以确保包含完整的库集:

ldd mybinary

这种解决方法也有局限性:ld-linux.so假设某些 Linux 内核 ABI,因此它们也必须兼容,但 Linux 内核 ABI 的变化频率低于libcABI,这可以为您争取几年(甚至几十年)的兼容性。

相关内容