リンカーとライブラリ

グループセクション

セクションの中には、相互関連のあるグループがあるものがあります。たとえば、インライン関数の 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–17 ELF グループセクションのフラグ

名前 

値 

GRP_COMDAT

0x1

GRP_COMDAT

GRP_COMDATCOMDAT グループであることを示します。これは、同じグループシグニチャを持つものとして重複が定義されている場合には、他のオブジェクトファイル内の他の COMDAT グループと重複する可能性があります。その場合には、重複グループのうち 1 つのみがリンカーによって保持されます。残りのグループの構成要素は破棄されます。

SHT_GROUP セクション内のセクションヘッダーインデックスは、そのグループを構成するセクションを識別します。これらのセクションは、SHF_GROUP フラグを sh_flags セクションヘッダー構成要素内に設定していなければなりません。リンカーがそのセクショングループを削除することを決めた場合、リンカーはそのグループのすべての構成要素を削除します。

未決定の参照を残すことなく、シンボルテーブルの処理を最小限にしてグループの削除を行うには、次の規則に従う必要があります。