64ビットシステムで32ビットバイナリを実行しているときに「Not found」メッセージが表示される


70

現在、debian(wheezy / amd64)に奇妙な問題があります。

サーバーをインストールするためにchrootを作成しました(詳細については説明できませんが、申し訳ありません)。そのパスを呼び出しましょう/chr_path/。物事を簡単にするために、このchrootをdebootstrap(wheezy / amd64も)で初期化しました。

すべては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

ファイルが存在し、問題ないようで、正しい権限があります。使用できますfilelsvimそれを実行しようとするとすぐに- ./perl例えば-私は得る:zsh: Not found ./perl

この状況は私にはかなり理解できます。さらに:

  • エラーを発生させることなく、chrootで他の基本的なバイナリ(/ bin / ls、...)を実行できます。
  • プロジェクトに付属している他のバイナリにも同じ問題があります
  • メインルート(/chr_path/some_path/perl)からバイナリを実行しようとすると、動作します。
  • 私は私のバイナリのコピーでバイナリの1つを入れようとしましたls。アクセス権が同じであることを確認しましたが、これは何も変更しませんでした(1つは機能していましたが、もう1つは機能していませんでした)

1
これは、Optwareがインストールしたバイナリに「そのようなファイルまたはディレクトリが存在しない」と同じ問題です。Perlは32ビットの実行可能ファイルであることに注意してください。32ビットランタイムシステムが欠落しています(libc6-i386パッケージ、またはia32-libs多数のライブラリが必要な場合)。
ジル

@Gilles:どうもありがとう!aptitude install ia32-libsが問題を解決しました!! perlが32ビットであることがわかりましたが、メインシステムで動作していたので(同じディストリビューション)、リンクされていないと想定していました。実際、ある時点でメインシステムに32ビットランタイムシステムをインストールしておく必要があります。
エレナハー

1
@Gilles:これを重複した質問としてマークするのではなく、簡潔な回答として追加すると思います。環境は十分に異なるため、問題が同じであっても、検索する人はどちらか一方にヒットする可能性が高くなります。
カレブ

1
@Calebまさにその理由で重複を削除するわけではありません。これを見つけた検索者は、他の投稿への重複リンクをたどるだけです。これが同じ問題である場合は、おそらくクローズする必要があります
Michael Mrozek

@MichaelMrozekこの質問に対する考えを変えました:根本的な問題は同じですが、具体的な解決策は少し異なります(一方のケースではARM ABIを混合せず、他方のamd64 Linuxディストリビューションで32ビットサポートを有効にします) 。結局、この質問は未解決のままだと思います。
ジル

回答:


72

「ローダー」に依存するファイルの実行に失敗すると、表示されるエラーは、実行中のファイルではなくローダーを参照している可能性があります。

  • 動的にリンクされたネイティブ実行可能ファイルのローダーは、動的ライブラリのロードを担当するシステムの一部です。/lib/ld.soまたはのようなもの/lib/ld-linux.so.2で、実行可能ファイルである必要があります。
  • スクリプトのローダーは、シェバン行に記載されているプログラムです。たとえば/bin/sh、で始まるスクリプトの場合です#!/bin/sh。(この場合、Bashとzshは、「コマンドが見つかりません」ではなく「不正なインタープリター」というメッセージを表示します。)

エラーメッセージは、ローダーが問題であることを示していないという点でかなり誤解を招きます。残念ながら、カーネルインターフェイスには数値のエラーコードを報告するだけのスペースがあり、実際にはエラーが別のファイルに関係していることを示すためではなく、これを修正するのは困難です。一部のシェルは、スクリプトに対して自身で作業を行います(スクリプトの#!行を読み取り、エラー状態を修正します)が、ネイティブバイナリに対して同じことをしようとするものは見ていません。

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

この状況は、適切なシステム(またはシステムファミリ)およびスーパーアーキテクチャでバイナリを実行しようとしたときに、サブアーキテクチャが間違っている場合によく発生します。ここでは、ELFバイナリが必要なシステムにELFバイナリがあります。したがって、カーネルはそれらを正常にロードします。これらはx86_64プロセッサで実行されるi386バイナリであるため、命令は理にかなっており、ローダーを検索できるポイントまでプログラムを取得します。しかし、このプログラムは32ビットプログラムであり(file出力が示すとおり)、32ビットローダーを探しているため、/lib/ld-linux.so.2おそらく64ビットローダーのみを/lib64/ld-linux-x86-64.so.2chrootにインストールしたことになります。

32ビットランタイムシステムをchrootにインストールする必要があります:ローダー、およびプログラムに必要なすべてのライブラリ。Debian wheezy以降、i386とx86_64の両方のサポートが必要な場合は、amd64のインストールから始めてmultiarchサポートを有効にします:run dpkg --add-architecture i386then apt-get updateおよびapt-get install libc6:i386 zlib1g:i386 …(Debianのperlパッケージの依存関係のリストを生成したい場合は、どのライブラリが必要に応じて使用できますaptitude search -F %p '~Rdepends:^perl$ ~ri386')。ia32-libsパッケージをインストールすることにより、共通ライブラリのコレクションを取り込むことができます(最初にマルチアーチサポートを有効にする必要があります)。Debian amd64からwheezyまで、32ビットローダーはlibc6-i386パッケージに含まれています。をインストールすると、32ビットライブラリのより大きなセットをインストールできia32-libsます。


これがエラーメッセージをトリガーできる唯一のものですか?32ビットライブラリがインストールされており、ここに出力がありますlddが、同じエラーが表示されます。
ネイサンオスマン


私はインストールを試みましたlsb-coreが、それは助けにならないようでした。これについては、新しい質問を開いた方がいいと思います。
ネイサンオスマン

これをありがとう、あなたはたった2日間のひっかきを終えたところです。すべてが静的にコンパイルされていると思いましたが、そうではありませんでした!
フィンオレアリー

5

バイナリで実行ldd(1)しますperl。多くの場合、Not found明らかに存在しているファイルの紛らわしいエラーは、プログラムで使用されている共有ライブラリの1つが見つからないためです。

したがって、バイナリが必要とする共有ライブラリに関して、chrootが不完全である可能性があります。


実際に私は得る:perl is not a dynamic executable私はchrootにいるとき、私は外部からの依存関係の正しいリストを取得します。私は現在、何か奇妙なものがあるかどうかを確認していますが、この種の不足を回避するためにデブートストラップを使用し、すでに適切な場所に多くのライブラリを配置していますシンボリックリンク?)
Elenaher

正直に言うと、debootstrapが完全なchrootを生成することを期待していたので、その点で私の答えが正しいとは思わないでしょう。しかし、私は以前にchroot問題で行方不明のライブラリに出くわしたことがあるので、答えが飛ぶかどうかを見ようと思いました。
カム

cf. メインポストでGillesにコメントしてください:あなたは正しかった。いくつかのライブラリがありませんでした。debootstrapの主な利点は、基本的なaptitudeインストールで問題を解決できることです:)
Elenaher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.