无此文件或目录?但是文件存在!

Fra*_*sco 231 64-bit files games executable

我下载了一个游戏 (Shank) 但 bin 文件没有运行。我尝试启动可执行文件时显示的错误是:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 278

您可能正在尝试在未安装 32 位支持的 64 位系统上运行 32 位二进制文​​件。

在三种情况下,您会收到“没有这样的文件或目录”消息:

  • 该文件不存在。我假设您已经检查过该文件确实存在(可能是因为 shell 完成了它)。
  • 有一个同名的文件,但它是一个悬空的符号链接。
  • 该文件存在,您甚至可以读取它(例如,该命令file shank-linux-120720110-1-bin显示类似“ELF 32 位 LSB 可执行文件……”之类的内容),但是当您尝试执行它时,您却被告知该文件不存在。

不可否认,最后一种情况下的错误消息令人困惑。它告诉您的是,缺少运行程序所需的运行时环境的一个关键组件。不幸的是,报告错误的渠道只有错误代码的空间,而不是这个额外信息的空间,因为它实际上是运行时环境的罪魁祸首。如果您需要此说明的技术版本,请阅读在 64 位系统上运行 32 位二进制文​​件时获取“未找到”消息

file命令将告诉您这个二进制文件是什么。除了少数例外,您只能为您的 Ubuntu 版本所针对的处理器架构运行二进制文件。主要的例外是您可以在 64 位(amd64,又名 x86_64)系统上运行 32 位(x86,又名 IA32)二进制文件。

在 Ubuntu 11.04 之前,要在 64 位安装上运行 32 位二进制文​​件,您需要安装ia32-libs 安装 ia32-libs. 您可能需要安装其他库(如果这样做,您将收到一条明确的错误消息)。

由于11.10(oneiric)引入了multiarch支持,还是可以安装的ia32-libs,但是可以选择更细粒度的方式,就足够了libc6-i386 安装 libc6-i386 (加上任何其他必要的库)。

  • @Francesco 请发布解决方案!它可能会帮助其他尝试在 Ubuntu 上运行 Shank 的人。[回答你自己的问题完全没问题](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)。 (4认同)

Avi*_*Raj 68

64 位 Ubuntu Multiarch 系统

仅当输出file file-name显示时才遵循此答案,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
Run Code Online (Sandbox Code Playgroud)

要在 64 位多i386架构Ubuntu 系统中运行 32 位可执行文件,您必须添加架构,还必须安装libc6:i386, libncurses5:i386,libstdc++6:i386这三个库包。

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Run Code Online (Sandbox Code Playgroud)


jtp*_*yda 12

为了扩展@Gilles 的回答,至少有三种情况会导致此错误:

  1. 该文件不存在。
  2. 该文件存在,但它是一个悬空的符号链接。
  3. 该文件存在(例如file命令有效),从而产生令人费解的错误消息。这可能意味着装载机有问题。

装载机问题的分类:

  1. 可执行文件的加载程序不存在。您可以使用 file 命令检查这一点,看看加载程序是否存在。例如

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    
    Run Code Online (Sandbox Code Playgroud)

    通知interpreter /lib64/ld-lsb-x86-64.so.3;如果此文件不存在,则需要安装它。对于 16.04 上的这个特定加载器,答案是sudo apt-get install lsb.

  2. 脚本加载器的问题(请参阅此答案)。

  3. 缺少共享库——用于ldd <file-name>检查任何“未找到”的库。有关更多信息,请参阅此答案

加载程序不存在可能是由于 32/64 位不匹配或其他一些原因。可能还有我不知道的其他类型的加载器错误。

  • 在我的例子中,`file lmutil` 没有显示解释器,但是 `ldd` 显示了,安装 `lsb` 解决了这个问题。 (4认同)
  • 尝试在 Alpine linux docker 映像上运行 Node 4.9.1 时遇到此类额外错误,我必须安装 libc6-compat 才能加载 `interpreter /lib64/ld-linux-x86-64.so.2` 。感谢您的补充! (2认同)

nob*_*bar 5

这是一个成绩单,显示了更多关于问题的性质,以及如何从 Ubuntu 16.04 修复它。请注意,即使file报告“动态链接”,也会ldd报告“不是动态可执行文件”。

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable
Run Code Online (Sandbox Code Playgroud)

一旦你安装了 libc6:i386,事情就会开始好转……

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

要完成这项工作,您可能需要一次确定并安装一个额外的库...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...
Run Code Online (Sandbox Code Playgroud)

我不知道是否有系统的方法来识别要安装的正确库。有一些猜测将错误消息映射到包名称(选项卡完成帮助)。