64ビットシステムで32ビットバイナリを実行すると「見つかりません」メッセージを受信する

64ビットシステムで32ビットバイナリを実行すると「見つかりません」メッセージを受信する

現在Debian(wheezy / amd64)で奇妙な問題が発生しました。

サーバーをインストールするためにchrootを作成しました(申し訳ありませんが、詳細は提供できません)。私たちはそれをパスと呼びます/chr_path/。作業を容易にするために、debootstrap(またwheezy / amd64)を使用してこのchrootを初期化しました。

chroot内ではすべてがうまくいくようですが、サーバーのインストールプログラムスクリプトを起動すると、次のメッセージが表示されます。 ( zsh: Not found /some_path/perl何らかの理由でインストーラにperlバイナリが含まれているか)

/some_path/当然、位置を確認してみると「perl」バイナリが見つかりました。filechroot環境からの返却:

/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、を使用できますlsvim、実行しようとすると(./perlたとえば)、次のような結果が表示されますzsh: Not found ./perl

この状況は私に理解されます。そして:

  • エラーなしでchrootで別のデフォルトのバイナリ(/ bin / ls、...)を実行できます。
  • プロジェクトに付属する他のバイナリにも同じ問題があります。
  • /chr_path/some_path/perlメインルート()でバイナリを実行しようとすると機能します。
  • バイナリの1つを私と比較してみましたls。アクセス権が同じであることを確認しましたが、何も変更されませんでした(1つは機能し、もう1つは機能しません)。

ベストアンサー1

「ローダー」に依存するファイルを実行できない場合、受信したエラーは実行中のファイルではなくローダーと関連がある可能性があります。

  • 動的にリンクされたデフォルトの実行可能ファイルのローダーは、動的ライブラリーのロードを担当するシステムの一部です。これは/lib/ld.so実行可能ファイルに似ており、実行可能ファイルで/lib/ld-linux.so.2なければなりません。
  • /bin/shスクリプトのローダーは、で始まるスクリプトなど、shebang行に記載されているプログラムです#!/bin/sh。 (この場合、Bashとzshは「コマンドが見つかりません」の代わりに「無効なソルバー」というメッセージを表示します。)

エラーメッセージは誤解を招き、ローダーに問題があることを示していません。残念ながら、カーネルインターフェイスには数値エラーコードを報告するスペースしかありませんが、エラーが実際に他のファイルに関連付けられていることを示すスペースがないため、この問題を解決するのは困難です。一部のシェルはスクリプト自体に対してこれを行いますが(#!スクリプトの行を読み取り、エラー条件を再評価します)、ネイティブバイナリに対して同じことをしたいシェルは見たことがありません。

lddまた、いくつかの特別な環境変数を設定してからプログラムを実行し、ローダーにタスクを実行させることで動作するため、バイナリでは機能しません。straceまた、カーネルが報告する以上を報告しないため、意味のある情報も提供しません。そして私たちが見たように、カーネルは知っているすべてを報告することはできません。

これは通常、正しいシステム(またはシステムスイート)とスーパーアーキテクチャに対してバイナリを実行しようとしていますが、無効なサブアーキテクチャに対して実行しようとしたときに発生します。これにはそれを必要とするシステムにELFバイナリがあるため、カーネルはそれを正しくロードできます。これはx86_64プロセッサで実行されているi386バイナリなので、これらのガイドラインは意味があり、プログラムがそのローダを見つけることができます。ただし、このプログラムは32ビットプログラム(出力に表示されている)で32ビットローダーを探しており、おそらくfilechrootには/lib/ld-linux.so.264ビットローダーのみがインストールされています。/lib64/ld-linux-x86-64.so.2

chroot:ローダーとプログラムに必要なすべてのライブラリに32ビットランタイムシステムをインストールする必要があります。 Debian wheezy から i386 と x86_64 をサポートしたい場合は、amd64 のインストールから起動して有効にしてください。マルチアーキテクチャsupport: run then dpkg --add-architecture i386(どのライブラリが必要かを調べるために Debian Perl パッケージの依存関係リストを作成する場合はこれを使用できます)。以下をインストールして、公共図書館のコレクションをインポートできます。apt-get updateapt-get install libc6:i386 zlib1g:i386 …aptitude search -F %p '~Rdepends:^perl$ ~ri386'ia32-libsパッケージ(最初にマルチアーキテクチャサポートを有効にする必要があります)Debian amd64からwheezyまで32ビットローダーがあります。libc6-i386パック。以下をインストールして、より大きな32ビットライブラリセットをインストールできます。ia32-libs

おすすめ記事