ldd 开始向我显示“不是动态可执行文件”

ldd 开始向我显示“不是动态可执行文件”

我有点困惑,因为我不明白为什么会发生这种情况:
我记得系统上的最后变化是

  • 为旧项目安装了 g++5(已被删除)
  • 自动清理
  • 已删除ldconfig 缓存(猜测是这个原因)

现在我无法启动某些应用程序。ldd 告诉我它“不是动态可执行文件”

igor@Linbox:/lib/i386-linux-gnu$ ldd libssl.so.1.0.0 
    is not a dynamic executable

igor@Linbox:/lib/i386-linux-gnu$ ldd libselinux.so.1 
    is not a dynamic executable

igor@Linbox:/bin$ ldd dd 
    linux-vdso.so.1 =>  (0x00007fff0b380000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb618c76000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb619269000)           

igor@Linbox:/lib/x86_64-linux-gnu$ ldd libc.so.6 
    /lib64/ld-linux-x86-64.so.2 (0x00007fcb44373000)
    linux-vdso.so.1 =>  (0x00007ffed8f33000)

版本:Linux Linbox 4.13.0-46-generic #51-Ubuntu SMP Tue Jun 12 12:36:29 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

我还检查了它是否仍然存在:

// for running x32 applications on x64 system
sudo dpkg --add-architecture i386
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

自从删除后,ld.so.cache我做到了sudo ldconfig。有新的缓存/etc/ld.so.cache

我是否错过了一些图书馆?

添加文件检查:

file /lib/i386-linux-gnu/libssl.so.1.0.0
/lib/i386-linux-gnu/libssl.so.1.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=c1e3854cb8b86f1006dc391d23f102ea1184cf25, stripped
file /lib/i386-linux-gnu/libselinux.so.1
/lib/i386-linux-gnu/libselinux.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=396cda857e41036061599a59c9f5fe62d7b50c4d, stripped
dpkg -S /lib/i386-linux-gnu/libssl.so.1.0.0
libssl1.0.0:i386: /lib/i386-linux-gnu/libssl.so.1.0.0
dpkg -S /lib/i386-linux-gnu/libselinux.so.1
libselinux1:i386: /lib/i386-linux-gnu/libselinux.so.1

从评论中检查了 libx32:

igor@Linbox:/lib/i386-linux-gnu$ ls -l /libx32/ld*
-rwxr-xr-x 1 root root 155092 Jan 12  2018 /libx32/ld-2.26.so
lrwxrwxrwx 1 root root     10 Jan 12  2018 /libx32/ld-linux-x32.so.2 -> ld-2.26.so

答案1

Bug 1616609,当可执行文件的加载器不存在时,ldd 错误地报告“不是动态可执行文件”,这可能是问题的原因(正如steeldriver 所建议的那样)。重新安装 libc6-x32 包以恢复它。请考虑将自己添加到错误中,也许有一天它会被修复——甚至建议使用补丁。

答案2

所以这对我有用。ldd 是一个脚本。在顶部附近(我的 arm Debian 10 上的第 29 行),它基于 RTLDLIST=/lib/ld-linux-aarch64.so.1 进行所有库搜索。在安装 arm 32 位库(dpkg --add-architecture armhf;apt update;等)后,我查看了 /lib 并看到 ld-linux-armhf.so.3 紧挨着 ld-linux-aarch64.so.1。因此这停止了 ldd 说“不是动态可执行文件”:

  1. 将 /usr/bin/ldd 复制到 /usr/bin/ldd32
  2. 编辑 /usr/bin/ldd32
  3. 用 RTLDLIST=/lib/ld-linux-armhf.so.3 替换 RTLDLIST=/lib/ld-linux-aarch64.so.1
  4. ldd32 <32 位二进制>

答案3

4.13.0-46-generic我已经通过将内核从以下版本更新至以下版本解决了该问题(感谢 ubfan1)4.15.0-39-generic

$ uname -a
Linux Linbox 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

/lib/i386-linux-gnu$ ldd libselinux.so.1 
    linux-gate.so.1 (0xf7fca000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xf7ee6000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7ee1000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7d05000)
    /lib/ld-linux.so.2 (0xf7fcc000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7ce6000)

答案4

扩展这里的一些其他答案——所有类型的不兼容架构都会导致此错误,而不仅仅是位大小。在 x86_64 设备上
尝试lddARM 或 AARCH 也会遇到同样的问题。
(情况可能并非如此,因为 OP 表示应用程序曾经运行过,但对于在谷歌搜索错误消息时到达此页面的其他人来说,情况可能如此)

尝试运行$file my.so并确认 so 文件适合您的设备!

相关内容