GNU/Linux >> Linux の 問題 >  >> Linux

64ビットシステムで32ビットバイナリを実行すると「見つかりません」というメッセージが表示されますか?

現在、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 カーネルが報告する以上の情報を報告しないため、意味のある情報も提供しません。また、これまで見てきたように、カーネルは認識しているすべての情報を報告することはできません。

関連:ddへのbsパラメータの最適値を決定する方法は?

この状況は、正しいシステム(またはシステムのファミリー)とスーパーアーキテクチャーに対してバイナリーを実行しようとしたが、サブアーキテクチャーが間違っている場合によく発生します。ここでは、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ビットライブラリのセットをインストールできます。 。


Linux
  1. パイプコマンドを実行するときにLinuxユーティリティは賢いですか?

  2. .gzファイルを解凍してテキストファイルを取得しますが、バイナリファイルを取得しますか?

  3. 「jobs:NotFound」というエラーメッセージが表示されるのはいつですか。

  1. 64ビットLinuxで32ビットアプリを実行していますか?

  2. バイナリ実行時の No such file or directory エラー

  3. noexec オプションを使用してファイル システムで bash スクリプトまたは c バイナリを実行する

  1. ファイルまたはディレクトリをコピーするときに所有権とファイルのアクセス許可をそのまま維持する方法

  2. ルートとして実行している場合でも、ファイルを削除できませんか?

  3. エラーの取得:bash:./program:バイナリ ファイルを実行できません:Exec フォーマット エラー