現在、debian(wheezy / amd64)で奇妙な問題が発生しています。
サーバーをインストールするためのchrootを作成しました(これ以上詳細を説明することはできません。申し訳ありません)。そのパスを/chr_path /
と呼びましょう 。
簡単にするために、このchrootをdebootstrap(wheezy / amd64)で初期化しました。
すべてがchroot内でうまく機能しているように見えましたが、サーバーのインストーラースクリプトを起動すると、次のようになりました:
zsh:見つかりません/ some_path / perl
(インストーラーにはいくつかの理由でperlバイナリが含まれています)
当然、 / some_path /
をチェックしました 場所と私は「perl」バイナリを見つけました。 ファイルコード> chroot環境では:
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
ファイルは存在し、問題ないようで、正しい権限を持っています。 file
を使用できます 、 ls
、 vim
その上で、しかし私がそれを実行しようとするとすぐに– ./ perl
例–次のようになります: zsh:見つかりません./perl
。
この状況は私には非常に理解できます。さらに:
- エラーを発生させることなく、chrootで他の基本的なバイナリ(/ bin / ls、…)を実行できます
- プロジェクトに付属している他のバイナリでも同じ問題が発生します
- メインルート(
/ chr_path / some_path / perl
)からバイナリを実行しようとしたとき )、動作します。 -
ls
のコピーを使用してバイナリの1つを配置しようとしました 。アクセス権が同じであることを確認しましたが、何も変わりませんでした(1つは機能し、もう1つは機能していませんでした)
承認された回答:
「ローダー」に依存するファイルの実行に失敗すると、発生するエラーは、実行しているファイルではなくローダーを参照している可能性があります。
- 動的にリンクされたネイティブ実行可能ファイルのローダーは、動的ライブラリのロードを担当するシステムの一部です。
/lib/ld.so
のようなものです または/lib/ld-linux.so.2
、実行可能ファイルである必要があります。 - スクリプトのローダーは、シバンの行に記載されているプログラムです。
/ bin / sh
#!/ bin / sh
で始まるスクリプトの場合 。 (この場合、Bashとzshは、「コマンドが見つかりません」ではなく「不正なインタープリター」というメッセージを表示します。)
エラーメッセージは、ローダーが問題であることを示さないという点でかなり誤解を招く可能性があります。残念ながら、カーネルインターフェイスには数値エラーコードを報告する余地しかなく、エラーが実際には別のファイルに関係していることを示す余地がないため、これを修正するのは困難です。一部のシェルは、スクリプトに対して自身で機能します(#!
を読み取る スクリプトの行とエラー状態の再処理)が、ネイティブバイナリに対して同じことを試みているのを見たことがありません。
ldd
いくつかの特別な環境変数を設定してからプログラムを実行し、ローダーに作業を任せることで機能するため、バイナリでも機能しません。 strace
カーネルが報告する以上の情報を報告しないため、意味のある情報も提供しません。また、これまで見てきたように、カーネルは認識しているすべての情報を報告することはできません。
この状況は、正しいシステム(またはシステムのファミリー)とスーパーアーキテクチャーに対してバイナリーを実行しようとしたが、サブアーキテクチャーが間違っている場合によく発生します。ここでは、ELFバイナリを期待するシステムにELFバイナリがあるため、カーネルはそれらを適切にロードします。これらはx86_64プロセッサで実行されているi386バイナリであるため、命令は意味をなし、プログラムをローダーを探すことができるポイントに到達させます。ただし、プログラムは32ビットプログラムです(ファイル
として) 出力は)を示し、32ビットローダー /lib/ld-linux.so.2
を探します 、おそらく64ビットローダー /lib64/ld-linux-x86-64.so.2
のみをインストールしました。 chrootで。
32ビットランタイムシステムをchrootにインストールする必要があります:ローダー、およびプログラムが必要とするすべてのライブラリ。 Debian wheezy以降、i386とx86_64の両方のサポートが必要な場合は、amd64のインストールから開始し、マルチアーチサポートをアクティブにします。 dpkg --add-architecture i386
を実行します。 次に、 apt-get update
およびapt-getinstall libc6:i386 zlib1g:i386…
(Debianのperlパッケージの依存関係のリストを生成したい場合は、どのライブラリが必要になる可能性が高いかを確認するには、 aptitude search -F%p'〜Rdepends:^ perl $〜ri386' コード> )。
ia32-libs
をインストールすると、一般的なライブラリのコレクションを取り込むことができます。 パッケージ(最初にマルチアーチサポートを有効にする必要があります)。 wheezyまでのDebianamd64では、32ビットローダーは libc6-i386
にあります パッケージ。 ia32-libs
をインストールすることで、より多くの32ビットライブラリのセットをインストールできます。 。