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_scope は SYMBOL_SCOPE または SYMBOL_VERSION 指令内でシンボルのスコープを定義します。デフォルトでは、シンボルは大域スコープを持つものと想定されます。これは symbol_scope の後ろにコロン (:) を付けて指定することによって変更できます。これらの行は、後続のスコープ宣言によって変更されるまで、後に続くすべてのシンボルのシンボルスコープを決定します。可能性のあるスコープ値と意味を、次の表に示します。
|
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 属性の解釈は、STUB_OBJECT 指令または –z stub コマンド行オプションが使用されるかどうかによって異なります。次の 3 つの場合が考えられます。
STUB_OBJECT 指令を使用しない場合、ASSERT 属性は不要です。ただし、ASSERT 属性が存在する場合、属性はリンク編集で収集された実際の値に対して検証されます。いずれかの ASSERT 属性が、関連付けられている実際の値と一致しない場合、リンク編集はエラーで終了します。
STUB_OBJECT 指令が使用され、–z stub コマンド行オプションが指定された場合、リンカーは ASSERT 指令を使用して、オブジェクトによって提供される大域シンボルの属性を定義します。スタブオブジェクトを参照してください。
STUB_OBJECT 指令が使用され、–z stub コマンド行オプションが指定されない場合、リンカーは、結果として生成されるオブジェクト内のすべての大域データが、対応する ASSERT 指令を持つことを要求します。この指令では、大域データをデータとして宣言し、サイズを指定する必要があります。このモードで、TYPE ASSERT 属性が指定されない場合、GLOBAL が想定されます。同様に、SH_ATTR が指定されない場合、デフォルト値 BITS が想定されます。これらのデフォルト値によって、スタブと実オブジェクトのデータ属性が互換性を持つことが保証されます。結果の ASSERT ステートメントは、上記の最初の場合と同じ方法で評価されます。STUB_OBJECT 指令を参照してください。
ASSERT は次の属性を受け入れます。
以前定義されたシンボルの別名を定義します。別名シンボルは、メインシンボルと同じタイプ、値、サイズを持ちます。ALIAS 属性は、TYPE、SIZE、および SH_ATTR 属性と一緒に使用できません。ALIAS が指定された場合、タイプ、サイズ、およびセクションの属性は、別名シンボルから取得されます。
ELF の symbol_binding を指定します。<sys/elf.h> 内で定義されている任意の STB_ 値を指定できます。STB_ 接頭辞は削除します。たとえば、GLOBAL または WEAK です。
ELF の symbol_type を指定します。<sys/elf.h> 内で定義されている任意の STT_ 定数を指定できます。STT_ 接頭辞は削除します。たとえば、OBJECT、COMMON、または FUNC となります。 また、ほかの mapfile 使用法との互換性を維持するために、FUNCTION および DATA をそれぞれ STT_FUNC および STT_OBJECT に指定できます。TYPE は ALIAS と同時に使用できません。
シンボルに関連付けられているセクションの属性を指定します。指定できる section_attributes を、Table 8–9 に示します。SH_ATTR は ALIAS と同時に使用できません。
予想されるシンボルサイズを指定します。SIZE は ALIAS と同時に使用できません。size_value 引数の構文は、SIZE 属性の説明にあるとおりです。SIZE 属性を参照してください。
予想されるシンボル値を指定します。
|
このシンボルが共有オブジェクト名 (soname) の補助フィルタであることを示します。補助フィルタの生成を参照してください。
このシンボルが共有オブジェクト名 (name) のフィルタであることを示します。標準フィルタの生成を参照してください。フィルタシンボルは、入力再配置可能オブジェクトから提供される補助実装を必要としません。したがって、シンボルの種類を定義してこの指令を使用し、絶対シンボルテーブルエントリを作成します。
symbol_flags は、次の値が 1 つ以上含まれる空白区切りリストとしてシンボル属性を指定します。
|
サイズ属性を設定します。この属性により、シンボル定義が作成されます。
size_value 引数には、数値またはシンボリック名 addrsize を指定できます。addrsize はメモリーアドレスを保持できるマシンワードのサイズを表します。リンカーは addrsize に対し、32 ビットオブジェクトを作成するときは値 4 を、64 ビットオブジェクトを構築するときは値 8 を代入します。addrsize は、条件付き入力の使用を必要としないで 32 ビットおよび 64 ビットオブジェクトに合わせて自動的に調節されるため、ポインタ変数および C 変数の long 型のサイズを表す際に使用すると便利です。
size_value 引数にはオプションで count 値を角括弧で囲んで接尾辞として追加できます。count が存在する場合、size_value と count が掛け合わされて最終的なサイズの値が取得されます。
シンボルのタイプ属性です。この属性は、COMMON、 DATA、または FUNCTION のいずれかです。COMMON を指定すると、一時的なシンボル定義になります。DATA および FUNCTION を指定すると、セクションシンボル定義または絶対的なシンボル定義になります。シンボルテーブルセクションを参照してください。
データ属性を指定すると、OBJT シンボルが作成されます。サイズを指定し値を指定しないデータ属性を指定すると、セクションシンボルが ELF セクションに関連付けられて作成されます。このセクションは、ゼロで埋められます。関数属性を指定すると、FUNC シンボルが作成されます。
サイズを指定し値を指定しない関数属性を指定すると、セクションシンボルが ELF セクションに関連付けられて作成されます。このセクションには、リンカーによって生成される void 関数が、次のシグニチャーを使用して割り当てられます。
void (*)(void)
値が指定されたデータまたは関数属性を指定すると、絶対値を表す ABS セクションインデックスを伴う適切なシンボルタイプが生成されます。
セクションデータシンボルの作成は、フィルタの作成時に役立ちます。実行可能ファイルからフィルタのセクションデータシンボルへの外部参照により、生成中のコピーが適切に再配置されます。コピー再配置を参照してください。
値の属性を示します。この属性により、シンボル定義が作成されます。