5.5.6 COMDATセクション(オブジェクトのみ)

選択定義補助形式の選択フィールドは、セクションがCOMDATセクションである場合に適用されます。このセクションは複数のオブジェクト ファイルによって定義することができます(フラグIMAGE_SCN_LNK_COMDATがセクション ヘッダのセクションフラグフィールドにセットされます)。選択フィールドはリンカがCOMDATセクションの複数の定義を解決する方法を決定します。

COMDATセクションのセクション値を持つ最初のシンボルは、セクションシンボルでなければなりません。このシンボルはセクションの名前、値が0の値フィールド、問題のCOMDATセクションの番号、値がIMAGE_SYM_TYPE_NULLのタイプ フィールド、値がIMAGE_SYM_CLASS_STATICのクラスフィールド、および1つの補助レコードを持ちます。2番目のシンボルは「COMDATシンボル」と呼ばれ、リンカによって選択フィールドと組み合わせて使われます。

選択フィールドの値を以下に示します。

定数 解説
IMAGE_COMDAT_SELECT_NODUPLICATES 1 このシンボルがすでに定義されている場合には、リンカは多重定義シンボルエラーを発行します。
IMAGE_COMDAT_SELECT_ANY 2 同じCOMDATシンボルを定義する任意のセクションがリンクされます。残りは削除されます。
IMAGE_COMDAT_SELECT_SAME_SIZE 3 リンカはこのシンボルの定義の中から任意のセクションを選択します。すべての定義が同じサイズでない場合には、多重定義シンボルエラーが発生します。
IMAGE_COMDAT_SELECT_EXACT_MATCH 4 このシンボルの定義の中からリンカが任意のセクションを選択します。すべての定義が正確に一致しない場合には、多重定義シンボルエラーが発生します。
IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 ある別のCOMDATセクションがリンクされる場合に、セクションがリンクされます。このもう1つのセクションは、セクション定義の補助シンボル レコードのNumberフィールドによって示されます。この設定を使うことは、複数のセクションにコンポーネントを持つ定義のために便利です(たとえば、コードはあるセクションに、データは別のセクションに)。しかし、この場合にはすべてセットとしてリンクまたは破棄されなければなりません。
IMAGE_COMDAT_SELECT_LARGEST 6 リンカはこのシンボルの定義から最大のものを選択します。複数の定義がこのサイズを持つ場合には、どれが選ばれるかは不定です。


戻る