这已发布在 serverfault 中 - 可能更适合那里。根据原始帖子稍作修改。
我们有一款基于 CentOS 4 32 位 Linux 构建的产品,该产品无需修改即可在 32 位和 64 位 CentOS/RHEL 4 和 5 以及 SLES 10 上运行。该产品也可在 SLES 9 64 位上运行,无需修改。[SLES 9 32 位需要不同的 libstdc++。]
主要二进制可执行文件的名称是“flume”
昨天我们尝试将其放在 64 位 Ubuntu 10 上,尽管文件在那里并且大小正确,但我们得到:
-bash:./flume:没有这样的文件或目录
‘file flume’ 显示它是一个 32 位 ELF(不记得确切的输出,并且系统处于隔离网络上)
如果放入 /usr/local/bin,则 'which flume' 返回:/usr/local/bin/flume
该文件被标记为可执行文件(执行了‘chmod +x flume’)并且 lsattr 显示属性位没有问题。
我还没能尝试“ldd flume”。我也没有试过“strace flume”。目前我的空调坏了。[这周真是糟透了!]
我现在怀疑有些图书馆不存在。
这是一个极其无益的信息,我从未见过这样的信息。
这是 Ubuntu 独有的现象吗?或者仅仅是本次安装独有的现象?
我们放弃了,转而使用 RHEL 4 系统,一切都很好。但我真的很想知道是什么原因造成的。
答案1
如果 flume 存在但其“加载器”不存在,则您会收到此消息,其中
- 本机可执行文件的加载器是其动态加载器,例如
/lib/ld-linux.so.2
; - 脚本的加载器是其 shebang 行中提到的程序,例如,
/bin/sh
如果脚本以 开头#!/bin/sh
。
就你的情况而言,你似乎没有在 64 位 Ubuntu 系统上安装 32 位动态加载程序。它在软件包中libc6-i386
。
strings ./flume | head -n 1
将显示所需的动态加载程序的路径flume
。这是少数完全无用的情况之一strace ./flume
。
我认为这种情况是 Unix 最容易引起误解的错误消息。不幸的是,修复它很困难:内核只能向程序调用者报告数字错误代码,因此它只能容纳“未找到命令”,而不能容纳它要查找的加载程序的名称。
答案2
我遇到过类似的事情,最终是因为 libstdc++5 已从 ubuntu 10.04 和 9.10 中删除。我不知道为什么我收到的错误不是找不到 libstdc++,但是当我安装它(从 debian stable 中)时,错误就消失了。
答案3
我在 Ubuntu 12.04 64 位上运行 EXE 时也遇到了类似的问题。
对我来说,解决方案是在目标系统上安装 LSB:
sudo apt-get install lsb
以前无法运行的程序现在突然可以运行了。使用
strings EXE-NOT-WORKING | head -1
提供了密钥。EXE-NOT-WORKING 中标识的 LSB 加载程序的转速高于其他正在运行的 EXE 文件中显示的默认加载程序。