ldd 显示存在 ELF 解释器,但我仍然得到 "No such file or directory"

ldd shows that ELF interpreter is present but I still get a "No such file or directory"

最近我努力将现有的 C++ 应用程序移植到新的生产环境(更新的内核、更新的 glibc 等)。即使 ldd 的输出显示我所有的 .so 都已找到,包括 ELF 解释器,执行结果总是 "No such file or directory"。

$ ldd my_app

    libpthread.so.0 => /lib/libpthread.so.0 (0x00007fd41afd6000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd41ae52000)
    libm.so.6 => /lib/libm.so.6 (0x00007fd41ad11000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fd41acf7000)
    libc.so.6 => /lib/libc.so.6 (0x00007fd41ab3a000)
    /lib64/ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x00007fd4258b5000) <= ELF Interpreter
    libconfig.so.9 => /usr/lib/libconfig.so.9 (0x00007fd41ab2c000)
    libsensors.so.4 => /usr/lib/libsensors.so.4 (0x00007fd41ab1b000)

$ 文件 my_app

     ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c8c7eeb2f6bdb96dab7b0cc9ad41aa6e3d610ec7, stripped

$ readelf -a my_app | grep "interpreter"

  [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

由于 ldd 的输出,我不认为我的问题与解释器有任何关系。所以我尝试了所有其他可能的解决方法,但都没有成功。在网上进行了大量挖掘之后,我遇到了一个相关的问题,该解决方案建议创建一个符号链接,从解释器的应用程序硬编码路径到真实路径。就我而言:

  ln -s /lib/ld-2.29.so /lib64/ld-linux-x86-64.so.2

终于解决了这个问题。最后我很沮丧,因为我没有寻找真正的问题,而且由于 ldd 的误导性输出,我花了很长时间才意识到它。

为什么 ldd 说解释器就在那里,即使当你 运行 二进制文件时它不会被加载?我对 ldd 的 use/output 的解释有误吗?

onto a new production environment

您的新生产环境将 ld-linux-x86-64.so.2 安装到 /lib 而不是 /lib64。这是非常不寻常和不标准的。许多二进制文件在这样的系统上将无法 运行。谁"made"这个系统,可能犯了一个严重的错误。

Why does ldd say that the interpreter is there

ldd 的工作方式是:它设置一个环境变量 LD_TRACE_OBJECTS=1 并调用编译时使用的 real 解释器。

由于您的系统(错误地)将 ld-linux 安装到 /libldd 尽职尽责地调用了 /lib/ld-linux-x86-64.so.2 确实存在,而且真的告诉过你。

一般来说,ldd值得信赖,尤其是当多个版本的 GLIBC 安装在一个系统上时。

在 glibc 中,动态加载器 ld.so. 既用作程序解释器又用作加载的共享对象。 ldd 只显示后者。它可以找到 ld.so 因为它在搜索路径上或在 ld.so 缓存中。相反,当内核尝试加载程序解释器时,它只使用程序中指定的确切路径,因此搜索路径等不适用。

根据 ABI manual 的正确路径是 /lib64/ld-linux-x86-64.so.2。如果你的系统没有,它不遵循 GNU/Linux x86-64 ABI,这很奇怪。