a.outフォーマット

出典: フリー百科事典『ウィキペディア(Wikipedia)』

a.outフォーマットは、UNIXにおける最初の実行ファイルおよびリンク可能ファイルのファイルフォーマットである。名前は、コンパイラの出力するファイルのデフォルトの名前がa.out(アセンブラアウトプット)であることから名付けられた。Windows上のgccではa.outファイルの代わりにa.exeを生成する。

ファイル構造[編集]

実行可能a.outは3つのセクションを持つ。一つはTEXTと呼ばれるコードセクションもう一つはDATAと呼ばれるデータセクションそして、ヘッダにサイズだけが記録されているBSSと呼ばれる0初期化データセクションであり、この順番に配置されている。

ファイルヘッダの先頭に置かれる、識別マジックナンバーはO_MAGIC(8進数で0407)、 NMAGIC (0410)、QMAGIC (0413)、ZMAGIC (0314) である。O_MAGICは最初に使われた形式で、コードもデータも区別無く連続して読み込まれる。このマジックナンバーは本来PDP-11で、ヘッダを飛ばして実行を開始するようなジャンプ命令であり、スタンドアローンのプログラムで使えるように設計されていた。N_MAGICはNew Magicの略で、基本的にO_MAGICと同じように連続してコードもデータも書かれているが、コードセグメントを読み込み可能領域にロードし、データセグメントを書き込み可能領域に配置するように設計されている。このことにより複数の同一プログラムを走らせるとき、コードを共有してプログラムの実行することが出来るようになっている。Z_MAGICはコード領域とデータ領域それぞれをページ境界に整列させたもので、このことによりページング環境で、全てを読み込まなくても実行可能にすることで、実行開始を高速化したものである。Q_MAGICは、やはりページングに対応したファイルであるが、ファイル上でのコードの整列をやめ、実行ファイルの先頭を0ページではなく、1ページ目からマップすることで未初期化ポインタ参照を検出できるようにし、ヘッダやデータの先頭部分を実行コードページの一部として読み込み専用マップすることで、ハードディスク容量が無駄になる事を防止したものである。

リンク可能ファイルには、シンボル情報や再配置情報が更につけ加わる。

欠点[編集]

問題点は、1つは共有ライブラリのサポートが難しいことであるが、FreeBSD等のいくつかのシステムにおいては実行ファイルとして、a.outのシンボル情報を残したファイルを使うことで、共有ライブラリを実装していた。また、C++等で必要な初期化セクション等の特殊な役割を持たせた部分がファイルフォーマットとしてサポートされていないことである。そのため、現在ではCOFFまたはELFに役割を譲っている。