4

我对以下命令序列感到困惑。

sh-4.2$ pwd
/home/willard
sh-4.2$ ls -l f
-rwxr-xr-x 1 willard users 59116 Jan 23 14:54 f
sh-4.2$ file f
f: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0xea0e08ff2b5a062698d45b78177acdd6bf140d1f, stripped
sh-4.2$ ./f
sh: ./f: No such file or directory
sh-4.2$ strace ./f
execve("./f", ["./f"], [/* 32 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++
sh-4.2$ ls -l f
-rwxr-xr-x 1 willard users 59116 Jan 23 14:54 f
sh-4.2$ uname -a
Linux xdat10 3.6.2-1-ARCH #1 SMP PREEMPT Fri Oct 12 23:58:58 CEST 2012 x86_64 GNU/Linux

这怎么可能?

4

2 回答 2

4

我发现有人有同样的问题(有相关解释)

在 64 位系统上运行 32 位二进制文​​件

引用最重要的句子:

当您尝试为正确的系统(或系统系列)和超架构运行二进制文件但错误的子架构时,通常会出现这种情况。在这里,您在需要 ELF 二进制文件的系统上有 ELF 二进制文件,因此内核可以很好地加载它们。它们是在 x86_64 处理器上运行的 i386 二进制文件,因此这些指令是有意义的,并且可以使程序达到可以查找其加载程序的程度。但是该程序是一个 32 位程序(如文件输出所示),正在寻找 32 位加载程序 /lib/ld-linux.so.2,而您可能只安装了 64 位加载程序 /lib64/ ld-linux-x86-64.so.2 在 chroot 中。

您需要在 chroot 中安装 32 位运行时系统:加载程序,以及程序所需的所有库。在 Debian amd64 上,32 位加载程序位于 libc6-i386 软件包中。您可以通过安装 ia32-libs 来安装一组更大的 32 位库。

我敢打赌有更好的方法来验证这一点,但我会尝试执行

ldd ./f

并在输出中搜索需要哪个加载器来执行它

于 2013-01-23T14:39:00.297 回答
1

人 2 执行:

ENOENT The file filename or a  script  or  ELF  interpreter  does  not
       exist,  or a shared library needed for file or interpreter can‐
       not be found.

您可以ldd针对此二进制文件运行以查找无法映射的库并从multilib.

于 2013-01-23T19:29:21.087 回答