ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
リンカーとライブラリ Oracle Solaris 11 Information Library (日本語) |
リンカーで作成されるオブジェクトには、2 つの型のバージョン情報が存在できます。
これらのセクションを形成する構造体は、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;
このメンバーは、構造体のバージョンを示します (次の表を参照)。
|
値 1 は最初のセクション形式を示し、拡張した場合は、より大きい番号の新しいバージョンが必要です。VER_DEF_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。
このメンバーは、バージョン定義に固有の情報を保持します (次の表を参照)。
|
基本バージョン定義は、バージョン定義またはシンボルの自動短縮簡約がファイルに適用されている場合、必ず存在します。基本バージョンは、ファイルの予約されたシンボルに対してデフォルトのバージョンを与えます。ウィークバージョン定義には、関連付けられているシンボルは存在しません。「ウィークバージョン定義の作成」を参照してください。
バージョンインデックス。各バージョン定義には、SHT_SUNW_versym エントリを適切なバージョン定義に関連付ける一意のインデックスが存在します。
Elf32_Verdaux 配列の要素数。
バージョン定義名のハッシュ値。この値は、「ハッシュテーブルセクション」に記述されているのと同じハッシング機能により生成されます。
この Elf32_Verdef エントリの先頭からバージョン定義名の Elf32_Verdaux 配列までのバイトオフセット。配列の先頭要素は存在しなければなりません。この要素はこの構造体が定義するバージョン定義文字列を指し示します。追加要素は存在可能です。要素の番号は vd_cnt 値で示されます。これらの要素は、このバージョン定義の依存関係を表します。これらの依存関係の各々は、独自のバージョン定義構造体を持っています。
この Elf32_Verdef 構造体の先頭から次の Elf32_Verdef エントリまでのバイトオフセット。
ヌル文字で終わる文字列への文字列テーブルオフセットで、バージョン定義名を指定します。
この Elf32_Verdaux エントリの先頭から次の Elf32_Verdaux エントリまでのバイトオフセット。
バージョン依存セクションは、タイプ 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;
このメンバーは、構造体のバージョンを示します (次の表を参照)。
|
値 1 は最初のセクション形式を示し、拡張した場合は、より大きい番号の新しいバージョンが必要です。VER_NEED_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。
Elf32_Vernaux 配列の要素数。
ヌル文字で終わっている文字列への文字列テーブルオフセットで、バージョン依存性のファイル名を指定します。この名前は、ファイル内に存在する .dynamic 依存性のどれかに一致します。「動的セクション」を参照してください。
この Elf32_Verneed エントリの先頭から、関連付けられているファイル依存性から要求されるバージョン定義の Elf32_Vernaux 配列までのバイトオフセット。少なくとも 1 つのバージョン依存性が存在する必要があります。追加バージョン依存性は存在することができ、また番号は vn_cnt 値で示されます。
この Elf32_Verneed エントリの先頭から次の Elf32_Verneed エントリまでのバイトオフセット。
バージョン依存性の名前のハッシュ値。この値は、「ハッシュテーブルセクション」に記述されているのと同じハッシング機能により生成されます。
バージョン依存性に固有の情報 (次の表を参照)。
|
ウィークバージョン依存性は、ウィークバージョン定義への最初の結び付きを示します。
ゼロでない場合、この依存関係バージョンに割り当てられたバージョンインデックス。SHT_SUNW_versym 内でこのインデックスを使用して、大域シンボル参照をこのバージョンに割り当てます。
Oracle Solaris 10 のリリースまでの Solaris のバージョンでは、バージョンシンボルインデックスは依存関係バージョンに割り当てられていませんでした。これらのオブジェクトでは、vna_other の値は 0 です。
ヌル文字で終わる文字列への文字列テーブルオフセット。バージョン依存性の名前を与えます。
この Elf32_Vernaux エントリの先頭から次の Elf32_Vernaux エントリまでのバイトオフセット。
バージョンシンボルセクションは、タイプ SHT_SUNW_versym によって定義されます。このセクションは、次の構造を持つ要素配列で構成されます。
typedef Elf32_Half Elf32_Versym; typedef Elf64_Half Elf64_Versym;
配列の要素数は、関連付けられているシンボルテーブルに存在するシンボルテーブルエントリ数に等しくなければなりません。この値は、セクションの sh_link 値で決定されます。配列の各要素には 1 つのインデックスが存在し、このインデックスは次の表に示す値をとることができます。
表 12-24 ELF バージョン依存インデックス
|
シンボルが、予約された特別なインデックス 0 に割り当てられる場合があります。このインデックスには次のいずれかの理由のために割り当てられます。
非大域シンボルは常に VER_NDX_LOCAL に割り当てられます。しかし、これは実際にはほとんどありません。多くの場合、バージョン管理セクションは、大域シンボルだけを含む動的シンボルテーブル .dynsym と合わせてのみ作成されます。
SHT_SUNW_verdef バージョン定義セクションがないオブジェクト内に定義された大域シンボル。
SHT_SUNW_verneed バージョン依存関係セクションがないオブジェクト内に定義された未定義大域シンボル。または、バージョン依存関係のセクションがバージョンインデックスを割り当てないオブジェクト内に定義された未定義大域シンボル。
シンボルテーブルの最初のエントリは常に NULL です。このエントリは常に VER_NDX_LOCAL を受け取りますが、その値には特別な意味はありません。
オブジェクトで定義されたバージョンは、1 から始まるバージョンインデックスが割り当てられ、バージョンごとに 1 増加します。インデックス 1 は最初の大域バージョンに予約されています。オブジェクトに SHT_SUNW_verdef バージョン定義セクションがない場合、そのオブジェクトで定義されたすべての大域シンボルはインデックス 1 を受け取ります。オブジェクトにバージョン定義セクションがない場合、VER_NDX_GLOBAL は前述の最初のバージョンを参照するだけです。
ほかの SHT_SUNW_verneed 依存関係からオブジェクトが要求したバージョンには、最終のバージョン定義インデックスの後に 1 を加えた値から始まるバージョンインデックスが割り当てられます。これらのインデックスもバージョンごとに 1 増加します。インデックス 1 は常に VER_NDX_GLOBAL に予約されているため、依存関係のバージョンが取り得るの最初のインデックスは 2 となります。
Oracle Solaris 10 リリースまでの Solaris のバージョンでは、バージョンインデックスは SHT_SUNW_verneed 依存関係バージョンに割り当てられていませんでした。このようなオブジェクトでは、いずれのシンボル参照のバージョンインデックスも、バージョン管理情報が該当のシンボルで使用できないことを表す 0 になります。