Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

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

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

typedef Elf32_Half      Elf32_Versym;
typedef Elf64_Half      Elf64_Versym;

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

表 12-27  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 になります。