Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

バージョン管理セクション

リンカーで作成されるオブジェクトには、2 つの型のバージョン情報が存在できます。

  • バージョン定義は大域シンボルの関連付けを提供し、タイプ SHT_SUNW_verdefSHT_SUNW_versym のセクションを使って実装されます。

  • バージョン依存関係は、ほかのオブジェクト依存関係からのバージョン定義要件を示しており、タイプ SHT_SUNW_verneedSHT_SUNW_versym のセクションを使って実装されます。

これらのセクションを形成する構造体は、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;
vd_version

このメンバーは、構造体のバージョンを示します (次の表を参照)。

名前
意味
VER_DEF_NONE
0
無効バージョン。
VER_DEF_CURRENT
>=1
現在のバージョン。

値 1 は最初のセクション形式を示し、拡張した場合は、より大きい番号の新しいバージョンが必要です。VER_DEF_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。

vd_flags

このメンバーは、バージョン定義に固有の情報を保持します (次の表を参照)。

名前
意味
VER_FLG_BASE
0x1
ファイルのバージョン定義。
VER_FLG_WEAK
0x2
ウィークバージョン識別子。

基本バージョン定義は、バージョン定義またはシンボルの自動短縮簡約がファイルに適用されている場合、必ず存在します。基本バージョンは、ファイルの予約されたシンボルに対してデフォルトのバージョンを与えます。ウィークバージョン定義には、関連付けられているシンボルは存在しません。ウィークバージョン定義の作成を参照してください。

vd_ndx

バージョンインデックス。各バージョン定義には、SHT_SUNW_versym エントリを適切なバージョン定義に関連付ける一意のインデックスが存在します。

vd_cnt

Elf32_Verdaux 配列の要素数。

vd_hash

バージョン定義名のハッシュ値。この値は、ハッシュテーブルセクションに記述されているのと同じハッシング機能により生成されます。

vd_aux

この Elf32_Verdef エントリの先頭からバージョン定義名の Elf32_Verdaux 配列までのバイトオフセット。配列の先頭要素は存在しなければなりません。この要素はこの構造体が定義するバージョン定義文字列を指し示します。追加要素は存在可能です。要素の番号は vd_cnt 値で示されます。これらの要素は、このバージョン定義の依存関係を表します。これらの依存関係の各々は、独自のバージョン定義構造体を持っています。

vd_next

この Elf32_Verdef 構造体の先頭から次の Elf32_Verdef エントリまでのバイトオフセット。

vda_name

ヌル文字で終わる文字列への文字列テーブルオフセットで、バージョン定義名を指定します。

vda_next

この 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;
vn_version

このメンバーは、構造体のバージョンを示します (次の表を参照)。

名前
意味
VER_NEED_NONE
0
無効バージョン。
VER_NEED_CURRENT
>=1
現在のバージョン。

値 1 は最初のセクション形式を示し、拡張した場合は、より大きい番号の新しいバージョンが必要です。VER_NEED_CURRENT の値は、現在のバージョン番号を示すために必要に応じて変化します。

vn_cnt

Elf32_Vernaux 配列の要素数。

vn_file

ヌル文字で終わっている文字列への文字列テーブルオフセットで、バージョン依存性のファイル名を指定します。この名前は、ファイル内に存在する .dynamic 依存性のどれかに一致します。動的セクションを参照してください。

vn_aux

この Elf32_Verneed エントリの先頭から、関連付けられているファイル依存性から要求されるバージョン定義の Elf32_Vernaux 配列までのバイトオフセット。少なくとも 1 つのバージョン依存性が存在する必要があります。追加バージョン依存性は存在することができ、また番号は vn_cnt 値で示されます。

vn_next

この Elf32_Verneed エントリの先頭から次の Elf32_Verneed エントリまでのバイトオフセット。

vna_hash

バージョン依存性の名前のハッシュ値。この値は、ハッシュテーブルセクションに記述されているのと同じハッシング機能により生成されます。

vna_flags

バージョン依存性に固有の情報 (次の表を参照)。

名前
意味
VER_FLG_WEAK
0x2
ウィークバージョン識別子。
VER_FLG_INFO
0x4
SHT_SUNW_versym 参照は情報提供のために存在しており、実行時に検証の必要はありません。

ウィークバージョン依存性は、ウィークバージョン定義への最初の結び付きを示します。

vna_other

ゼロでない場合、この依存関係バージョンに割り当てられたバージョンインデックス。SHT_SUNW_versym 内でこのインデックスを使用して、大域シンボル参照をこのバージョンに割り当てます。

Oracle Solaris 10 のリリースまでの Solaris のバージョンでは、バージョンシンボルインデックスは依存関係バージョンに割り当てられていませんでした。これらのオブジェクトでは、vna_other の値は 0 です。

vna_name

ヌル文字で終わる文字列への文字列テーブルオフセット。バージョン依存性の名前を与えます。

vna_next

この Elf32_Vernaux エントリの先頭から次の Elf32_Vernaux エントリまでのバイトオフセット。

バージョンシンボルセクション

バージョンシンボルセクションは、タイプ SHT_SUNW_versym によって定義されます。このセクションは、次の構造を持つ要素配列で構成されます。

typedef Elf32_Half      Elf32_Versym;
typedef Elf64_Half      Elf64_Versym;

配列の要素数は、関連付けられているシンボルテーブルに存在するシンボルテーブルエントリ数に等しくなければなりません。この値は、セクションの sh_link 値で決定されます。配列の各要素には 1 つのインデックスが存在し、このインデックスは次の表に示す値をとることができます。

表 39  ELF バージョン依存インデックス
名前
意味
VER_NDX_LOCAL
0
シンボルにローカル適用範囲が存在します。
VER_NDX_GLOBAL
1
シンボルに大域適用範囲が存在し、ベースバージョン定義に割り当てられています。
>1
シンボルは大域適用範囲を持ち、ユーザー定義のバージョン定義 SHT_SUNW_verdef、またはバージョン依存関係 SHT_SUNW_verneed に割り当てられています。

シンボルが、予約された特別なインデックス 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 になります。