リンカーとライブラリ

バージョン情報

リンカーで作成されるオブジェクトには、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;
vd_version

この構成要素は、構造体自身のバージョンを示します。

表 7-31 バージョン定義構造のバージョン

名前 

値 

意味 

VER_DEF_NONE

0

無効バージョン 

VER_DEF_CURRENT

>=1

現在のバージョン 

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

vd_flags

この構成要素は、バージョン定義に固有の情報を保持します。

表 7-32 バージョン定義セクションのフラグ

名前 

値 

意味 

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_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;
vn_version

この構成要素は、構造体自身のバージョンを示します。

表 7-34 バージョン依存構造体のバージョン

名前 

値 

意味 

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

この構成要素は、バージョン依存性に固有の情報を保持します。

表 7-35 バージョン依存構造のフラグ

名前 

値 

意味 

VER_FLG_WEAK

0x2

ウィークバージョン識別子 

ウィークバージョン依存性は、ウィークバージョン定義への最初の結び付きを示します。詳細は、「バージョン定義の作成」を参照してください。

vna_other

この構成要素は現在、使用されていません。

vna_name

この構成要素は、空文字で終わっている文字列への文字列テーブルオフセットを保持し、バージョン依存性の名前を与えます。

vna_next

この構成要素は、この Elf32_Vernaux エントリの先頭から次の Elf32_Vernaux エントリまでのバイトオフセットを保持します。