メッセージNo such file or directory
は実行可能ファイルを参照していません:a.out
。代わりに、32ビットの動的にリンクされた実行可能ファイルを実行するために必要なヘルパープログラムを指します。a.out
今、私はこれらのすべてがこの素晴らしい記事で非常によく説明されているのを見つけました:
静的および動的リンケージ
バイナリ実行可能ファイルには、静的にリンクされたものと動的にリンクされたものの2種類があります。最初に静的にリンクされたものについて:プログラムがライブラリ関数を呼び出したいとき、それは名前でそれを参照します。ソースからプログラムをビルドすると、プログラムで使用されるすべてのライブラリ関数がライブラリからプログラムにコピーされます。プログラムには、使用するライブラリ関数のコードだけでなく、独自のコードも含まれます。次に、呼び出し元で、名前がプログラム内の対応する関数のアドレスに変更されます。このプロセスは、呼び出されたリンク、それは関数自体、その実装と一緒に関数の名前をリンクしているため。プログラムのビルド後にリンクを変更できないため、これはstaticと呼ばれます。
動的にリンクされたプログラムの動作は異なります。プログラムは、ライブラリ関数を名前で参照します。プログラムをビルドすると、2つのリストがプログラムとともにアセンブルされて保存されます。どのライブラリ関数がどの場所で使用されるかのリストと、プログラムが使用する関数を含むライブラリのリストです。プログラムを構築するためのすべてです。
後で、実行時に、特別なヘルパープログラム、いわゆるダイナミックリンカーが、ライブラリリスト上の各ライブラリについてファイルシステム内の特定の場所を検索し、それをメモリにロードします。これで、動的リンカーは、ライブラリ関数が使用可能なメモリアドレスを認識します。最初のリストを使用して、ライブラリ関数を呼び出すすべての場所に正しいアドレスを書き込みます。その後、動的にリンクされたプログラムを実行できます。