セクションの中には、相互関連のあるグループがあるものがあります。たとえば、インライン関数の out-of-line 定義では、実行可能命令を含むセクションに加えて、参照定数を含む読み取り専用のデータセクション、1 つまたは複数のデバッギング情報セクション、およびその他の情報セクションを必要とする場合があります。さらに、これらのセクションの中には、セクションのうちの 1 つが削除されたり他のオブジェクトからの重複によって置き換えられたりすると意味を成さない内部参照がある可能性があります。そのため、これらのグループは、リンクされるオブジェクトに含めるまたはそこから削除する場合は、1 つのユニットとして扱う必要があります。
タイプ SHT_GROUP のセクションは、そういったセクションのグループ化を定義します。含んでいるオブジェクトのシンボルテーブルのうちの 1 つからのシンボル名が、そのセクショングループについてのシグニチャを提供します。SHT_GROUP セクションのセクションヘッダーが、識別シンボルエントリを指定します。sh_link 構成要素はそのエントリを含むシンボルテーブルセクションのセクションヘッダーインデックスを含み、sh_info 構成要素はその識別エントリのシンボルテーブルインデックスを含みます。そのセクションヘッダーの sh_flags 構成要素は、0 を含みます。そのセクションの名前 (sh_name) は指定されません。
SHT_GROUP セクションのセクションデータは、Elf32_Word エントリの配列です。最初のエントリは、フラグです。残りのエントリは、セクションヘッダーのインデックスのシーケンスです。
表 7-16 ELF セクショングループのフラグ
名前 |
値 |
---|---|
GRP_COMDAT |
0x1 |
COMDAT グループであることを示します。これは、同じグループシグニチャを持つものとして重複が定義されている場合には、他のオブジェクトファイル内の他の COMDAT グループと重複する可能性があります。その場合には、重複グループのうち 1 つのみがリンカーによって保持され、残りのグループの構成要素は破棄されます。
SHT_GROUP セクション内のセクションヘッダーインデックスは、そのグループを構成するセクションを識別します。それらの各セクションは、SHF_GROUP フラグを sh_flags セクションヘッダー構成要素内に設定していなければなりません。リンカーがそのセクショングループを削除することを決めた場合、リンカーはそのグループのすべての構成要素を削除します。
未決定の参照を残すことなく、シンボルテーブルの処理を最小限にしてグループの削除を行うには、次の規則に従う必要があります。
グループを形成するセクションへのそのグループの外のセクションからの参照は、STB_GLOBAL または STB_WEAK 結合とセクションインデックス SHN_UNDEF を伴うシンボルテーブルエントリを介して行わなければなりません。その参照を含むオブジェクト内に同じシンボルの定義がある場合は、その参照とは別のシンボルテーブルエントリを持つ必要があります。そのグループの外のセクションは、そのグループのセクション内に含まれるアドレスについて STB_LOCAL 結合を持つシンボルを参照しない (タイプ STT_SECTION を持つシンボルを含む) 可能性があります。
グループを形成するセクションへのそのグループの外からの非シンボル参照が無い場合もあります。たとえば、sh_link または sh_info 構成要素内でのグループ構成要素のセクションヘッダーインデックスは使用できません。
そのグループのセクションのうちの 1 つに関連すると定義され、かつそのグループの一部でないシンボルテーブルセクション内に含まれるシンボルテーブルエントリは、そのグループの構成要素が破棄される場合には、削除されます。