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

印刷ビューの終了

更新: 2014 年 7 月
 
 

SYMBOL_SCOPE/SYMBOL_VERSION 指令

SYMBOL_SCOPE および SYMBOL_VERSION 指令は、大域シンボルのスコープと属性を指定するために使用されます。SYMBOL_SCOPE は、命名されていないベースシンボルバージョンのコンテキストで動作し、SYMBOL_VERSION は、明示的に命名された大域バージョンにシンボルを収集するために使用されます。SYMBOL_VERSION 指令を使用すると、下位互換性を保ちながらオブジェクトの進化をサポートできる安定したインタフェースを作成できます。

SYMBOL_VERSION の構文は次のとおりです。

        SYMBOL_VERSION version_name {
                symbol_scope:
                        *;

                symbol_name;
                symbol_name {
                        ASSERT = {
                                ALIAS = symbol_name;
                                BINDING = symbol_binding;
                                TYPE = symbol_type;

                                SIZE = size_value;
                                SIZE = size_value[count];
		                VALUE = value;
                        };
                        AUXILIARY = soname;
                        FILTER = soname;
                        FLAGS = symbol_flags....;

                        SIZE = size_value;
                        SIZE = size_value[count];

                        TYPE = symbol_type;
                        VALUE = value;
                };
        } [inherited_version_name....];

SYMBOL_SCOPE はバージョン名を受け入れませんが、それ以外は同一です。

        SYMBOL_SCOPE {
                ....
        };

SYMBOL_VERSION 指令では、version_name がこの一連のシンボル定義のラベルを提供します。このラベルは、出力オブジェクト内のバージョン定義を指定します。1 つ以上の継承されたバージョン (inherited_version_name) を空白区切りで指定できます。この場合、新しく定義されたバージョンは、指定されたバージョンを継承します。Chapter 9, インタフェースおよびバージョン管理を参照してください。

symbol_scopeSYMBOL_SCOPE または SYMBOL_VERSION 指令内でシンボルのスコープを定義します。デフォルトでは、シンボルは大域スコープを持つものと想定されます。これは symbol_scope の後ろにコロン (:) を付けて指定することによって変更できます。これらの行は、後続のスコープ宣言によって変更されるまで、後に続くすべてのシンボルのシンボルスコープを決定します。可能性のあるスコープ値と意味を、次の表に示します。

表 8-8  シンボルのスコープのタイプ
スコープ
意味
default / global
このスコープの大域シンボルは、すべての外部オブジェクトに対して可視となります。このタイプのシンボルに対するオブジェクト内からの参照は実行時に結合されるため、介入が可能となります。この可視性スコープがデフォルトになりますが、これは、ほかのシンボル可視性テクニックを使って降格または削除することができます。このスコープ定義には、シンボルに STV_DEFAULT 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。
hidden / local
このスコープの大域シンボルは、ローカル結合を持つシンボルに縮小されます。このスコープのシンボルは、ほかの外部オブジェクトから見えません。このスコープ定義には、シンボルに STV_HIDDEN 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。
protected / symbolic
このスコープの大域シンボルは、すべての外部オブジェクトに対して可視となります。これらのシンボルに対するオブジェクト内からの参照はリンク編集時に結合されるため、実行時の介入は防止されます。この可視性スコープは、ほかのシンボル可視性テクニックを使って降格または削除することができます。このスコープ定義には、シンボルに STV_PROTECTED 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。
exported
このスコープの大域シンボルは、すべての外部オブジェクトに対して可視となります。このタイプのシンボルに対するオブジェクト内からの参照は実行時に結合されるため、介入が可能となります。ほかのどのようなシンボル可視性テクニックを使っても、このシンボル可視性を降格または削除することはできません。このスコープ定義には、シンボルに STV_EXPORTED 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。
singleton
このスコープの大域シンボルは、すべての外部オブジェクトに対して可視となります。オブジェクト内からそのようなシンボルへの参照は実行時にバインドされるので、シンボルの 1 つのインスタンスだけがプロセス内のすべての参照にバインドされます。ほかのどのようなシンボル可視性テクニックを使っても、このシンボル可視性を降格または削除することはできません。このスコープ定義には、シンボルに STV_SINGLETON 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。
eliminate
このスコープの大域シンボルは不可視です。これらのシンボルテーブルのエントリは削除されます。このスコープ定義には、シンボルに STV_ELIMINATE 可視性が指定された場合と同じ効果があります。Table 12–23 を参照してください。

symbol_name はシンボルの名前です。この名前により、修飾属性に応じて、シンボル定義またはシンボル参照が生成されます。修飾属性のないもっとも簡潔な形式で、シンボル参照が作成されます。この参照は、–Defining Additional Symbols with the -u optionで説明した -u オプションを使用した追加シンボルの定義 オプションを使用して生成する参照とまったく同じものです。通常、このシンボル名に修飾属性が付いている場合には、シンボル定義は、関連する属性を使用して生成されます。

local スコープが定義された場合、シンボル名を特別な「*」自動縮小 (auto-reduction) 指令として定義できます。可視性が明示的に定義されていないシンボルは、生成される動的オブジェクト内のローカル結合に降格されます。明示的な可視性の定義は、mapfile 定義、再配置可能オブジェクト内にカプセル化された可視性定義のいずれかに起因します。同様に、eliminate スコープが定義された場合、シンボル名を特別な「*」自動削除 (auto-elimination) 指令として定義できます。可視性が明示的に定義されていないシンボルは、生成される動的オブジェクトから削除されます。

SYMBOL_VERSION 指令が指定されるか、SYMBOL_VERSION または SYMBOL_SCOPE のいずれかで自動縮小が指定された場合、作成されるイメージにバージョン情報が記録されます。このイメージが実行可能プログラムまたは共有オブジェクトである場合には、シンボル縮小も適用されます。

作成されるイメージが再配置可能オブジェクトである場合は、デフォルトにより、シンボル縮小は適用されません。この場合、シンボル縮小はバージョン情報の一部として記録されます。これらの縮小は、再配置可能オブジェクトが最終的に実行可能ファイルまたは共有オブジェクトの生成に使用されるときに適用されます。リンカーの –B reduce オプションを使用すると、再配置可能オブジェクトを生成するときに、強制的にシンボル縮小を実行できます。

バージョン情報の詳細は、Chapter 9, インタフェースおよびバージョン管理に記載されています。


注 - インタフェース定義を確実に安定させるためには、シンボル名の定義に対しワイルドカードによる拡張を行わないようにします。

シンボルをバージョンに割り当てたり、そのスコープを指定したり、またはその両方を行うには、symbol_name 自体をリストすると簡単です。オプションのシンボル属性は {} 括弧内で指定できます。有効な属性を次に示します。

ASSERT 属性

ASSERT 属性は、シンボルの予期される特性を指定するために使用されます。リンカーは、リンク編集で得られたシンボル特性と、ASSERT 属性によって指定されたシンボル特性を比較します。表明された属性と実際の属性が一致しない場合、重大なエラーが発生し、出力オブジェクトは作成されません。

ASSERT 属性の解釈は、STUB_OBJECT 指令または –z stub コマンド行オプションが使用されるかどうかによって異なります。次の 3 つの場合が考えられます。

  1. STUB_OBJECT 指令を使用しない場合、ASSERT 属性は不要です。ただし、ASSERT 属性が存在する場合、属性はリンク編集で収集された実際の値に対して検証されます。いずれかの ASSERT 属性が、関連付けられている実際の値と一致しない場合、リンク編集はエラーで終了します。

  2. STUB_OBJECT 指令が使用され、–z stub コマンド行オプションが指定された場合、リンカーは ASSERT 指令を使用して、オブジェクトによって提供される大域シンボルの属性を定義します。スタブオブジェクトを参照してください。

  3. STUB_OBJECT 指令が使用され、–z stub コマンド行オプションが指定されない場合、リンカーは、結果として生成されるオブジェクト内のすべての大域データが、対応する ASSERT 指令を持つことを要求します。この指令では、大域データをデータとして宣言し、サイズを指定する必要があります。このモードで、TYPE ASSERT 属性が指定されない場合、GLOBAL が想定されます。同様に、SH_ATTR が指定されない場合、デフォルト値 BITS が想定されます。これらのデフォルト値によって、スタブと実オブジェクトのデータ属性が互換性を持つことが保証されます。結果の ASSERT ステートメントは、上記の最初の場合と同じ方法で評価されます。STUB_OBJECT 指令を参照してください。

ASSERT は次の属性を受け入れます。

ALIAS

以前定義されたシンボルの別名を定義します。別名シンボルは、メインシンボルと同じタイプ、値、サイズを持ちます。ALIAS 属性は、TYPESIZE、および SH_ATTR 属性と一緒に使用できません。ALIAS が指定された場合、タイプ、サイズ、およびセクションの属性は、別名シンボルから取得されます。

BIND

ELF の symbol_binding を指定します。<sys/elf.h> 内で定義されている任意の STB_ 値を指定できます。STB_ 接頭辞は削除します。たとえば、GLOBAL または WEAK です。

TYPE

ELF の symbol_type を指定します。<sys/elf.h> 内で定義されている任意の STT_ 定数を指定できます。STT_ 接頭辞は削除します。たとえば、OBJECTCOMMON、または FUNC となります。 また、ほかの mapfile 使用法との互換性を維持するために、FUNCTION および DATA をそれぞれ STT_FUNC および STT_OBJECT に指定できます。TYPEALIAS と同時に使用できません。

SH_ATTR

シンボルに関連付けられているセクションの属性を指定します。指定できる section_attributes を、Table 8–9 に示します。SH_ATTRALIAS と同時に使用できません。

SIZE

予想されるシンボルサイズを指定します。SIZEALIAS と同時に使用できません。size_value 引数の構文は、SIZE 属性の説明にあるとおりです。SIZE 属性を参照してください。

VALUE

予想されるシンボル値を指定します。

表 8-9  SH_ATTR の値
セクション属性
意味
BITS
セクションのタイプは SHT_NOBITS ではありません
NOBITS
セクションのタイプは SHT_NOBITS です

AUXILIARY 属性

このシンボルが共有オブジェクト名 (soname) の補助フィルタであることを示します。補助フィルタの生成を参照してください。

FILTER 属性

このシンボルが共有オブジェクト名 (name) のフィルタであることを示します。標準フィルタの生成を参照してください。フィルタシンボルは、入力再配置可能オブジェクトから提供される補助実装を必要としません。したがって、シンボルの種類を定義してこの指令を使用し、絶対シンボルテーブルエントリを作成します。

FLAGS 属性

symbol_flags は、次の値が 1 つ以上含まれる空白区切りリストとしてシンボル属性を指定します。

表 8-10  シンボルフラグの値
フラグ
意味
DIRECT
このシンボルを直接結合する必要があることを示します。このキーワードをシンボル定義で使用すると、参照が、構築中のオブジェクト内から定義に直接結合されます。このフラグをシンボル参照で使用すると、定義を提供する依存関係に直接結合されます。Chapter 6, 直接結合を参照してください。このフラグを PARENT フラグとともに使用すると、実行時に任意の親への直接結合を確立することもできます。
DYNSORT
このシンボルをソートセクションに取り込むべきであることを示します。シンボルソートセクションを参照してください。シンボルタイプは STT_FUNCSTT_OBJECTSTT_COMMON、または STT_TLS である必要があります。
EXTERN
シンボルが、作成されるオブジェクトの外部で定義されていることを示します。通常、このキーワードは、コールバックルーチンへのラベル付けで定義されます。このフラグによって、–z defs オプションで示される未定義シンボルが抑制されます。このフラグは、シンボル参照を生成する場合にのみ有効です。このシンボルの定義が、リンク編集時に結合されるオブジェクト内部で生成された場合には、暗黙的に無視されます。
INTERPOSE
このシンボルは割り込み処理として機能することを示します。このフラグは、動的実行可能ファイルを生成するときにだけ使用できます。このフラグは、割り込みシンボルを定義する際に、–z interpose オプションを使用したときよりも詳細な制御を提供します。
NODIRECT
このシンボルを直接結合してはならないことを示します。この状態は、作成されるオブジェクト内からの参照と外部参照に適用されます。Chapter 6, 直接結合を参照してください。このフラグを PARENT フラグとともに使用すると、実行時に任意の親への直接結合を回避することもできます。
NODYNSORT
このシンボルをソートセクションに含めてはならないことを示します。シンボルソートセクションを参照してください。
PARENT
シンボルが、作成中のオブジェクトの親で定義されていることを示します。親とは、実行時にこのオブジェクトを明示的な依存関係として参照するオブジェクトです。親は、dlopen(3C) を使用して、このオブジェクトを実行時に参照することもできます。このフラグは通常、コールバックルーチンへのラベル付けで定義されます。このフラグを DIRECT または NODIRECT フラグとともに使用すると、親への直接的または間接的な参照を個別に確立することもできます。このフラグによって、–z defs オプションで示される未定義シンボルが抑制されます。このフラグは、シンボル参照を生成する場合にのみ有効です。このシンボルの定義が、リンク編集時に結合されるオブジェクト内部で生成された場合には、暗黙的に無視されます。
STUB_ELIMINATE
スタブオブジェクトからこのシンボルを省略する必要があることを示します。スタブオブジェクトを使用した、廃止インタフェースの非表示を参照してください。

SIZE 属性

サイズ属性を設定します。この属性により、シンボル定義が作成されます。

size_value 引数には、数値またはシンボリック名 addrsize を指定できます。addrsize はメモリーアドレスを保持できるマシンワードのサイズを表します。リンカーは addrsize に対し、32 ビットオブジェクトを作成するときは値 4 を、64 ビットオブジェクトを構築するときは値 8 を代入します。addrsize は、条件付き入力の使用を必要としないで 32 ビットおよび 64 ビットオブジェクトに合わせて自動的に調節されるため、ポインタ変数および C 変数の long 型のサイズを表す際に使用すると便利です。

size_value 引数にはオプションで count 値を角括弧で囲んで接尾辞として追加できます。count が存在する場合、size_valuecount が掛け合わされて最終的なサイズの値が取得されます。

TYPE 属性

シンボルのタイプ属性です。この属性は、COMMON DATA、または FUNCTION のいずれかです。COMMON を指定すると、一時的なシンボル定義になります。DATA および FUNCTION を指定すると、セクションシンボル定義または絶対的なシンボル定義になります。シンボルテーブルセクションを参照してください。

データ属性を指定すると、OBJT シンボルが作成されます。サイズを指定し値を指定しないデータ属性を指定すると、セクションシンボルが ELF セクションに関連付けられて作成されます。このセクションは、ゼロで埋められます。関数属性を指定すると、FUNC シンボルが作成されます。

サイズを指定し値を指定しない関数属性を指定すると、セクションシンボルが ELF セクションに関連付けられて作成されます。このセクションには、リンカーによって生成される void 関数が、次のシグニチャーを使用して割り当てられます。

        void (*)(void)

値が指定されたデータまたは関数属性を指定すると、絶対値を表す ABS セクションインデックスを伴う適切なシンボルタイプが生成されます。

セクションデータシンボルの作成は、フィルタの作成時に役立ちます。実行可能ファイルからフィルタのセクションデータシンボルへの外部参照により、生成中のコピーが適切に再配置されます。コピー再配置を参照してください。

VALUE 属性

値の属性を示します。この属性により、シンボル定義が作成されます。