COFF

COFF (Common Object File Format) はUnixシステムで用いられる実行ファイル、オブジェクトファイル、共有ライブラリのファイルフォーマット仕様である。Unix System V で導入され、SVR4で導入されたELFによって広く置き換えられる前に、XCOFFやECOFFなどの拡張仕様の基礎を形作った。COFFとその派生種はその後もUnixライクシステムやMicrosoft Windows上で使われ続けている。

歴史 
元々のUnixのオブジェクトファイルフォーマットa.outは非常に単純な設計であり、たとえば シンボリックデバッグ情報や共有ライブラリなどを十分にサポートすることができなかった。AT&Tの内外でUnixライクシステムの開発が進むにつれ、これらの問題への別の解決策や、異なる問題が生じ始めた。

COFFはAT&TのVAX以外の32bitプラットフォーム向けのUNIX System Vで導入された。既存のAT&Tのa.outフォーマットに対する改善点として、COFFは元からシンボリックデバッグ情報や共有ライブラリ、拡張の機構をサポートしていた。

しかし、COFFはa.outの改善版であると同時に、その設計にも制限があった。セクションの最大数や、セクション名の長さ、シンボリックデバッグ情報をC++のような新しい言語でサポートすることができない、などの制約があった。SVR4のリリースとともに、AT&TはCOFFをELFで置き換えた。IBMはAIXでXCOFFフォーマットを使用し、DEC、SGIなどの会社はECOFFを使用した。それ以外のシステムは互換性のない方法でそれぞれ実行ファイルのフォーマットを拡張してこれらの問題点を克服した。

拡張されたCOFFはいくつかのUnixライクなプラットフォームで使用され続け、まずは組み込みシステムにおいて、そしておそらく今日でもっとも広く普及したCOFFの用途はMicrosoftのPortable Executable (PE) フォーマットである。

Windows NTのために開発されたPEフォーマット（PE/COFF と表記されることもある）は、オブジェクトファイルに COFF ヘッダを使用し、実行ファイル内のPEヘッダのコンポーネントとして使用する。

特徴 
COFFのa.outに対する主要な改善点はオブジェクトファイル内に名前のついた複数のセクションを導入したことであった。オブジェクトファイルはそれぞれ異なる数と種類のセクションを持つことができた。

シンボリックデバッグ情報 
COFFのシンボリックデバッグ情報は、プログラムの関数と変数の（文字による）シンボル名称と、実行のトレースやブレークポイントの設定に用いられる行番号情報からなっている。a.outは元々シンボリックデバッグ情報をサポートしていないが、スタブのような機構を用いることでこの欠点をある程度は克服することができた。

シンボル名称はCOFFのシンボルテーブルに格納される。シンボルテーブルの各エントリーには名前、記憶クラス、型、値およびセクション番号が含まれる。短い名前（8文字以下）はシンボルテーブルに直接格納され、長い名前はCOFFオブジェクトの末端にある文字列テーブルに対するオフセットとして格納される。

記憶クラスは外部変数(C_EXT)、自動（スタック）変数(C_AUTO)、レジスタ変数(C_REG)、関数(C_FCN)などのシンボルが表現する型の実体を示す。シンボルの種類はシンボルの実体の値を説明するもので、すべてのC言語のデータ型を含んでいる。

適切なオプションとともにコンパイルされた場合、COFFオブジェクトファイルはオブジェクトファイルのテキストセクションのとりうる各ブレークポイントの行番号情報を格納する。行番号情報は二つの形態をとる。一番目の形態では、コード内のとりうる各ブレークポイントについて、行番号のエントリーがアドレスと対応する行番号を格納する。二番目の形態では、関数の開始を示すシンボルテーブルのエントリーを識別し、関数の名前でブレークポイントを有効にする。

相対仮想アドレス 
COFFファイルが生成される際には、通常ファイルがメモリのどこにロードされるかは不明である。ファイルの最初のバイトがロードされた仮想アドレスは、イメージベースアドレスと呼ばれる。ファイルの残りは必ずしも連続した領域にロードされる必要はなく、異なるセクションにロードされる。

相対仮想アドレス(RVA)は、標準的な仮想アドレスと混同してはならない。相対仮想アドレスはメモリにロードされたオブジェクトの仮想アドレスから、ファイルイメージのベースアドレスを引いたものである。仮にファイルが文字通りディスクからメモリに（そのまま）割り当てられると、RVAはファイルについてのオフセットと同一になるが、実際にはそのようなことはめったにない。

RVAという用語はイメージファイル内のオブジェクトについてのみ用いられる。メモリにロードされると、イメージのベースアドレスが加算され、通常の仮想アドレスとなって使用される。

脚注

参考文献 
DJGPP COFF Spec
 

オブジェクトファイルフォーマット
UNIX