もうおぼろげになってしまった暗い過去に, 単純なハードウェアが ありました. この単純なハードウェアは, 単純で小さなシステムを サポートしていました. a.out はこの単純なシステム (PDP-11) での 作業を行なうバイナリとして完全に適したものだったのです. 人々はこの単純なシステムから UNIX を移植する際に, a.out フォーマットをそのまま使いました. というのは Motorola 68k, VAXen, といったアーキテクチャへの UNIX の初期の移植ではこれで十分だったからです.
やがてある聡明なエンジニアがソフトウェアでちょっとした
トリックを使うことを決めました. 彼はいくつかのゲートを削り取って
CPU のコアをより速く走らせることができたのです. これは
新しい種類のハードウェア (今日では RISC として知られています) で
動いたのです. a.out
はこのハードウェアには
適していなかったので, このハードウェア上で多くのフォーマットが,
限定された単純な a.out
フォーマットでのものよりもより良い
パフォーマンスを出すことを目指して開発されたのです.
COFF
, ECOFF
, そしていくつかの有名でないフォーマットが
ELF
が標準になる前に開発され, それらの限界が探求されたのです.
さらに, プログラムサイズは巨大になり, ディスク (および物理メモリ)
は依然として相対的に小さかったため, 共用ライブラリのコンセプトが
誕生しました.
また, VM システムはより複雑なものになりました.
これらの個々の進歩は a.out
フォーマットを使用して遂げられましたが,
その有用性は新しい機能とともにどんどん広がってきました.
これらに加え, 実行時に必要なものを動的にロードする, または
初期化コードの実行後にプログラムの一部を破棄し, コアメモリおよび /
またはスワップ空間を節約するという要望が高まりました.
プログラミング言語はさらに複雑になり, main 関数の前に自動的に
コールされるコードの要望が高まりました.
多くの機能拡張がおこなわれ, a.out
フォーマットがこれらすべてを
実現できるようになり, それらはしばらくは基本的に動作していました.
やがて, a.out
はコードでのオーバヘッドと複雑さを増大させずに
これらの問題すべてを処理することに無理がでてきました.
一方, ELF
はこれらの問題の多くを解決しますが, 現状稼働している
システムからの切替えは厄介なものになるでしょう.
そのため ELF
は, a.out
のままでいることがELF
への
移行よりももっと厄介なものになるまで待つ必要がありました.
しかし時が経つにつれ, FreeBSD のビルドツールの元となったツー
ル群(特にアセンブラとローダ)と FreeBSD のビルドツール群は異なっ
た進化の経路をたどりました. FreeBSD のツリーでは, 共有ライブラ
リが追加され, バグフィックスも行われました. もともとのツール群
を作成した GNU の人たちは, プログラムを書き直し, クロスコンパ
イラのサポート, 異なるフォーマットを任意に取り込む機能などを追
加していきました. 多くの人々が FreeBSD をターゲットとしたクロ
スコンパイラの構築を試みましたが, FreeBSD の使っている as と
ld の古いプログラムコードはクロスコンパイルをサポートしておら
ず, うまくいきませんでした. 新しい GNU のツール群 (binutils)
は, クロスコンパイル, 共有ライブラリ, C++ 拡張などの機能をサポー
トしています. さらに数多くのベンダが ELF
バイナリをリリー
スしています. FreeBSD にとって ELF
バイナリが実行できる
ことは, 非常にメリットがあります. ELF
バイナリが FreeBSD
で動くのなら, a.out
を動かすのに手間をかける必要はありま
せんね. 長い間忠実によく働いた老いた馬は, そろそろ牧草地で休ま
せてあげましょう.
ELF
は a.out に比べてより表現力があり, ベースのシステム
に対してより幅広い拡張性を提供できます. ELF
用のツールは
よりよく保守されています. また多くの人にとって重要なクロスコン
パイルもサポートしています. ELF
の実行速度は, ほんの少し
a.out より遅いかもしれませんが, 実際に速度の差をはかるのは困難
でしょう. ELF
と a.out の間には, ページマッピング, 初期化
コードの処理など多くの違いがありますが, とりたてて重要なものは
ありません. しかし違いがあるのは確かです. ほどなく, GENERIC カー
ネルから a.out
のサポートが外さます. a.out
のプログ
ラムを実行する必要性がなくなれば, 最終的に a.out
のサポー
トはカーネルから削除されます.