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/ しかインストールしていません。 chroot の ld-linux-x86-64.so.2。

chroot に 32 ビット ランタイム システムをインストールする必要があります。つまり、ローダーと、プログラムに必要なすべてのライブラリです。Debian amd64 では、32 ビット ローダーは libc6-i386 パッケージにあります。ia32-libs をインストールすることで、より大きな 32 ビット ライブラリ セットをインストールできます。

これを確認するためのより良い方法があるに違いありませんが、実行しようとします

ldd ./f

exec'itに必要なローダーを出力で検索します

于 2013-01-23T14:39:00.297 に答える
1

男 2 execve:

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 に答える