64ビットVMで32ビットプログラムを実行できない


12

Ubuntu 10.04 32ビットマシンで小さな「hello world」Cプログラムをコンパイルしました。次に、Ubuntu 12.10(64ビット)VMWare仮想マシンに実行可能ファイル(a.out)を配置し、実行しようとしました(./a.out)。OSはファイルを識別せず、「No such file or directory」と表示します。しかし、64ビットのラップトップで実行されているUbuntu 12.10(64ビット)に同じ実行可能ファイルを配置すると、正常に実行され、目的の出力が得られます。VMはIBMブレードサーバーで実行されています。VMの結果が知りたいのはなぜですか?

回答:


20

メッセージNo such file or directoryは実行可能ファイルを参照していません:a.out。代わりに、32ビットの動的にリンクされた実行可能ファイルを実行するために必要なヘルパープログラムを指します。a.out

今、私はこれらのすべてがこの素晴らしい記事で非常によく説明されているのを見つけました:

静的および動的リンケージ

バイナリ実行可能ファイルには、静的にリンクされたものと動的にリンクされたものの2種類があります。最初に静的にリンクされたものについて:プログラムがライブラリ関数を呼び出したいとき、それは名前でそれを参照します。ソースからプログラムをビルドすると、プログラムで使用されるすべてのライブラリ関数がライブラリからプログラムにコピーされます。プログラムには、使用するライブラリ関数のコードだけでなく、独自のコードも含まれます。次に、呼び出し元で、名前がプログラム内の対応する関数のアドレスに変更されます。このプロセスは、呼び出されたリンク、それは関数自体、その実装と一緒に関数の名前をリンクしているため。プログラムのビルド後にリンクを変更できないため、これはstaticと呼ばれます。

動的にリンクされたプログラムの動作は異なります。プログラムは、ライブラリ関数を名前で参照します。プログラムをビルドすると、2つのリストがプログラムとともにアセンブルされて保存されます。どのライブラリ関数がどの場所で使用されるかのリストと、プログラムが使用する関数を含むライブラリのリストです。プログラムを構築するためのすべてです。

後で、実行時に、特別なヘルパープログラム、いわゆるダイナミックリンカーが、ライブラリリスト上の各ライブラリについてファイルシステム内の特定の場所を検索し、それをメモリにロードします。これで、動的リンカーは、ライブラリ関数が使用可能なメモリアドレスを認識します。最初のリストを使用して、ライブラリ関数を呼び出すすべての場所に正しいアドレスを書き込みます。その後、動的にリンクされたプログラムを実行できます。


3
この「ファイルが見つかりません」というエラーメッセージは、初めて°͜°を混乱させ、アプリに必要なファイルが欠落していることを意味することを理解しました。
ラムチャンドラアプテ2013年

@RaduRădeanu、あなたはヘルパープログラムと呼んでいますか?動的にリンクされたライブラリだと思います。もしそうなら、それをヘルパープログラムと呼ぶだけで説明が混乱します。
ゴーレム

-ここで私はこの問題を理解するために有用であることが分かったリンクで、64ビットシステム上で32ビットのバイナリを実行するときにメッセージを「見つかりません」入門
ゴーレム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.