実行ファイルとは
実行ファイル(Executable file)とは、
コンピュータが特定のタスクを実行するために必要な、解釈可能な命令が記述されたファイルのことです。実行可能ファイル、実行可能プログラム、実行形式ファイルとも呼ばれます。実行ファイルは、
コンピュータに直接指示を出すものであり、データファイルとは異なり、それ自体が
コンピュータにとって意味のある存在です。
実行ファイルの構成
実行ファイルの中身は、基本的には特定の
CPUが理解できる
機械語で記述された命令が格納されています。これは、
バイナリファイルとも呼ばれる形式です。ただし、場合によっては、
インタプリタによって解釈される中間コードや、シェルスクリプト、バッチファイルなどの
スクリプト言語が含まれることもあります。
オペレーティングシステム(OS)は、実行ファイルを識別するために、ファイル名の
拡張子(例:.exe、.bin)や、ファイル
メタデータ(例:
UNIX系のファイルパーミッション
ビット)を使用します。
実行ファイルの生成過程
ソフトウェア開発では、通常、人間が理解しやすい
高水準言語(例:C、Java)で
ソースコードを記述します。しかし、
コンピュータが実行できるのは
機械語のみです。そのため、
高水準言語の
ソースコードは、
コンパイラによって
機械語に変換されます。
アセンブリ言語を使用する場合は、アセンブラによって
機械語に変換されます。コンパイルまたはアセンブルされた結果は、
オブジェクトファイルとして保存されます。複数の
オブジェクトファイルをリンクすることで、最終的に実行ファイルが生成されます。
オブジェクトファイルは、ELFなどのコンテナフォーマットに保存され、
機械語コードは.textセクション、静的変数は.dataセクション、静的定数は.rodataセクションというように、構造化されて格納されます。
実行ファイルの構造
実行ファイルは、OSやファームウェア、
ブートローダーなどのシステムによって実行されるため、システムのABI(Application Binary Interface)に従う必要があります。最も単純なケースでは、実行ファイルをメモリにロードし、先頭アドレスから実行を開始します。しかし、実際には、実行ファイルにはエントリーポイントなどの追加の
メタデータが含まれていることが一般的です。
例えば、ELF形式の実行ファイルでは、ヘッダーのe_entryフィールドにエントリーポイントのアドレスが格納されています。GCCなどの
コンパイラでは、_startシンボルによって、リンカがこのアドレスを指定します。
また、実行ファイルには、ランタイムシステムと呼ばれる、言語の機能(タスクスケジューリング、例外処理、静的コンストラクタ/デストラクタの実行など)や、システムコールを呼び出すための命令セットが含まれています。C言語では、crt0オブジェクトをリンクすることで、ランタイムライブラリが呼び出され、プログラムの開始と終了処理が行われます。
実行ファイルには、実行に必要な環境情報、
デバッグ情報、シンボル情報など、
機械語プログラム自体には含まれない情報も多く含まれています。ただし、組み込みシステムの開発や、
コンパイラ/リンカの動作を学習するなどの目的で、これらの情報を省略したい場合もあります。C言語では、明示的にリンカスクリプトを指定することで、通常のランタイムを省略し、エントリーポイントを直接生成することが可能です。
実行ファイルは、プロセッサ固有であるだけでなく、OSにも依存します。
実行ファイルの形式
実行ファイル形式とは、プログラムを実行ファイルとして格納するためのファイル形式のことです。これは、コンテナフォーマットの一種であり、一定の規格に従ってプログラムをファイル内に配置することで、プロセッサやOSが実行ファイルをロードできるようにするものです。
実行ファイル形式は、各実行プラットフォームに対応したものが定義されており、代表的なものとしては、以下のようなものがあります。
- - Windows: PE (Portable Executable)
- - Linux/Unix: ELF (Executable and Linkable Format)
- - macOS: Mach-O
まとめ
実行ファイルは、
コンピュータの動作において不可欠な要素です。その構造や生成過程、形式を理解することで、より深く
コンピュータの仕組みを理解することができます。
[参考]: