リンカーで作成されるオブジェクトには、2 つの型のバージョン情報が存在できます。
「バージョン定義」は大域シンボルとの関連付けを与え、SHT_SUNW_verdef および SHT_SUNW_versym 型のセクションを使用して実現される
「バージョン依存性」は他のオブジェクト依存性からのバージョン定義要求を示し、SHT_SUNW_verneed 型のセクションを使用して実現される
これらのセクションを形成する構造体は、sys/link.h で定義されます。バージョン情報が存在するセクションには、.SUNW_version という名前が付けられます。
このセクションは、SHT_SUNW_verdef 型で定義されます。このセクションが存在する場合、SHT_SUNW_versym セクションも存在しなければなりません。これら 2 つの構造体を使用することで、シンボルとバージョン定義の関連付けがファイル内で維持されます (詳細は、「バージョン定義の作成」を参照)。このセクションの要素の構造体は、以下のとおりです。
typedef struct { Elf32_Half vd_version; Elf32_Half vd_flags; Elf32_Half vd_ndx; Elf32_Half vd_cnt; Elf32_Word vd_hash; Elf32_Word vd_aux; Elf32_Word vd_next; } Elf32_Verdef; typedef struct { Elf32_Word vda_name; Elf32_Word vda_next; } Elf32_Verdaux; typedef struct { Elf64_Half vd_version; Elf64_Half vd_flags; Elf64_Half vd_ndx; Elf64_Half vd_cnt; Elf64_Word vd_hash; Elf64_Word vd_aux; Elf64_Word vd_next; } Elf64_Verdef; typedef struct { Elf64_Word vda_name; Elf64_Word vda_next; } Elf64_Verdaux; |
この構成要素は、構造体自身のバージョンを示します。
名前 |
値 |
意味 |
---|---|---|
VER_DEF_NONE |
0 |
無効バージョン |
VER_DEF_CURRENT |
>=1 |
現在のバージョン |
値 1 は最初のセクション形式を示し、拡張した場合は番号を大きくします。VER_DEF_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。
この構成要素は、バージョン定義に固有の情報を保持します。
名前 |
値 |
意味 |
---|---|---|
VER_FLG_BASE |
0x1 |
ファイル自身のバージョン定義 |
VER_FLG_WEAK |
0x2 |
ウィークバージョン識別子 |
ベースのバージョン定義は、バージョン定義またはシンボルの自動短縮簡約がファイルに適用されている場合、必ず存在します。ベースバージョンは、ファイルの予約されたシンボルに対してデフォルトのバージョンを与えます (「出力イメージの生成」を参照)。ウィークバージョン定義には、関連付けられているシンボルは存在しません (詳細は、「ウィークバージョン定義の作成」を参照)。
この構成要素は、バージョンインデックスを保持します。各バージョン定義には、SHT_SUNW_versym エントリを適切なバージョン定義に関連付ける一意のインデックスが存在します。
この構成要素は、Elf32_Verdaux 配列の要素数を示します。
この構成要素は、バージョン定義名の値を保持します (この値は、「ハッシュテーブル」に記述されているハッシング機能で生成されます)。
この構成要素は、この Elf32_Verdef エントリの先頭からバージョン定義名の Elf32_Verdaux 配列までのバイトオフセットを保持します。配列の先頭要素は存在しなければならず、この構造体が定義するバージョン定義文字列を指し示します。追加要素は存在することができ、また番号は vd_cnt 値で示されます。これらの要素は、このバージョン定義の依存関係を表します。これらの依存関係の各々は、独自のバージョン定義構造体を持っています。
この構成要素は、この Elf32_Verdef 構造体の先頭から次の Elf32_Verdef エントリまでのバイトオフセットを保持します。
この構成要素は、空文字で終わっている文字列への文字列テーブルオフセットを保持し、バージョン定義名を与えます。
この構成要素は、この Elf32_Verdaux エントリの先頭から次の Elf32_Verdaux エントリまでのバイトオフセットを保持します。
このセクションは SHT_SUNW_versym 型で定義されており、以下の構造を持つ要素配列からなります。
typedef Elf32_Half Elf32_Versym; typedef Elf64_Half Elf64_Versym; |
配列の要素数は、関連付けられているシンボルテーブルに存在するシンボルテーブルエントリ数 (セクション sh_link 値で決定される) に等しくなければなりません。配列の各要素には 1 つのインデックスが存在し、このインデックスは表 7-33 に示す値をとることができます。
表 7-33 バージョン依存インデックス
名前 |
値 |
意味 |
---|---|---|
VER_NDX_LOCAL |
0 |
シンボルにローカル適用範囲が存在する。 |
VER_NDX_GLOBAL |
1 |
シンボルに大域適用範囲 (ベースバージョン定義に割り当てられる) が存在する |
|
>1 |
シンボルに大域適用範囲 (ユーザー定義バージョン定義に割り当てられる) が存在する |
VER_NDX_GLOBAL より大きいインデックス値は、SHT_SUNW_verdef セクションのエントリの vd_ndx 値に一致しなければなりません。VER_NDX_GLOBAL より大きいインデックス値が存在しない場合、SHT_SUNW_verdef セクションが存在する必要はありません。
このセクションは、SHT_SUNW_verneed 型で定義されます。このセクションは、ファイルの動的依存性から要求されるバージョン定義を示すことで、ファイルの動的依存性要求を補足します。依存性にバージョン定義が存在する場合のみ、記録がこのセクションにおいて行われます。このセクションの要素の構造体は、次のとおりです。
typedef struct { Elf32_Half vn_version; Elf32_Half vn_cnt; Elf32_Word vn_file; Elf32_Word vn_aux; Elf32_Word vn_next; } Elf32_Verneed; typedef struct { Elf32_Word vna_hash; Elf32_Half vna_flags; Elf32_Half vna_other; Elf32_Word vna_name; Elf32_Word vna_next; } Elf32_Vernaux; typedef struct { Elf64_Half vn_version; Elf64_Half vn_cnt; Elf64_Word vn_file; Elf64_Word vn_aux; Elf64_Word vn_next; } Elf64_Verneed; typedef struct { Elf64_Word vna_hash; Elf64_Half vna_flags; Elf64_Half vna_other; Elf64_Word vna_name; Elf64_Word vna_next; } Elf64_Vernaux; |
この構成要素は、構造体自身のバージョンを示します。
名前 |
値 |
意味 |
---|---|---|
VER_NEED_NONE |
0 |
無効バージョン |
VER_NEED_CURRENT |
>=1 |
現在のバージョン |
値 1 は最初のセクション形式を示し、拡張した場合は番号を大きくします。VER_NEED_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。
この構成要素は、Elf32_Vernaux 配列の要素数を示します。
この構成要素は、空文字で終わっている文字列への文字列テーブルオフセットを保持し、バージョン依存性が存在するファイル名を与えます。この名前は、ファイルに存在する .dynamic 依存性 (「動的セクション」を参照) のどれかに一致します。
この構成要素は、この Elf32_Verneed エントリの先頭から、関連付けられているファイル依存性から要求されるバージョン定義の Elf32_Vernaux 配列までのバイトオフセットを保持します。少なくとも 1 つのバージョン依存性が存在しなければなりません。追加バージョン依存性は存在することができ、また番号は vn_cnt 値で示されます。
この構成要素は、この Elf32_Verneed エントリの先頭から次の Elf32_Verneed エントリまでのバイトオフセットを保持します。
この構成要素は、バージョン依存性の名前のハッシュ値を保持します (この値は、「ハッシュテーブル」に記述されているハッシュ関数で生成されます)。
この構成要素は、バージョン依存性に固有の情報を保持します。
名前 |
値 |
意味 |
---|---|---|
VER_FLG_WEAK |
0x2 |
ウィークバージョン識別子 |
ウィークバージョン依存性は、ウィークバージョン定義への最初の結び付きを示します。詳細は、「バージョン定義の作成」を参照してください。
この構成要素は現在、使用されていません。
この構成要素は、空文字で終わっている文字列への文字列テーブルオフセットを保持し、バージョン依存性の名前を与えます。
この構成要素は、この Elf32_Vernaux エントリの先頭から次の Elf32_Vernaux エントリまでのバイトオフセットを保持します。