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

印刷ビューの終了

更新: 2014 年 7 月
 
 

機能セクション

SHT_SUNW_cap セクションはオブジェクトの機能要件を指定します。これらの機能はオブジェクト機能と呼ばれます。このセクションは、オブジェクト内の関数の機能要件または初期化されたデータ項目も指定できます。これらの機能はシンボル機能と呼ばれます。このセクションには、次の構造の配列が含まれます。sys/elf.h を参照してください。

typedef struct {
        Elf32_Word      c_tag;
        union {
                Elf32_Word      c_val;
                Elf32_Addr      c_ptr;
        } c_un;
} Elf32_Cap;

typedef struct {
        Elf64_Xword     c_tag;
        union {
                Elf64_Xword     c_val;
                Elf64_Addr      c_ptr;
        } c_un;
} Elf64_Cap;

この種の各オブジェクトに対して、c_tag は c_un の解釈を制御します。

c_val

このオブジェクトは、さまざまに解釈される整数値を表します。

c_ptr

このオブジェクトは、プログラムの仮想アドレスを表します。

次の機能タグがあります。

表 12-15  ELF 機能配列タグ
名前
c_un
CA_SUNW_NULL
0
無視
CA_SUNW_HW_1
1
c_val
CA_SUNW_SF_1
2
c_val
CA_SUNW_HW_2
3
c_val
CA_SUNW_PLAT
4
c_ptr
CA_SUNW_MACH
5
c_ptr
CA_SUNW_ID
6
c_ptr
CA_SUNW_NULL

機能グループの最後にマークを付けます。

CA_SUNW_HW_1CA_SUNW_HW_2

ハードウェア機能の値を示します。c_val 要素は、関連ハードウェア機能を表す値を含みます。 SPARC プラットフォームでは、ハードウェア機能は sys/auxv_SPARC.h に定義されます。x86 プラットフォームでは、ハードウェア機能は sys/auxv_386.h に定義されます。

CA_SUNW_SF_1

ソフトウェア機能の値を示します。c_val 要素は、sys/elf.h に定義される関連ソフトウェア機能を表す値を含みます。

CA_SUNW_PLAT

プラットフォーム名を指定します。c_ptr 要素は、プラットフォーム名を定義する、ヌル文字で終わる文字列の文字列テーブルオフセットを含みます。

CA_SUNW_MACH

マシン名を指定します。c_ptr 要素は、マシンハードウェア名を定義する、ヌル文字で終わる文字列の文字列テーブルオフセットを含みます。

CA_SUNW_ID

機能識別子名を指定します。c_ptr 要素は、識別子名を定義する、ヌル文字で終わる文字列の文字列テーブルオフセットを含みます。この要素は機能を定義しませんが、機能グループの参照に使用できる固有のシンボリック名を機能グループに割り当てます。この識別子名は、リンカーの –z symbolcap 処理の一部として局所シンボルに変換される、すべての大域シンボル名に追加されます。オブジェクト機能のシンボル機能への変換を参照してください。

再配置可能オブジェクトには、機能セクションを含めることができます。リンカーは、複数の入力再配置可能オブジェクトからの機能セクションを 1 つの機能セクションに統合します。リンカーを使用すると、オブジェクトの構築時に機能を定義することもできます。機能要件の特定を参照してください。

CA_SUNW_NULL で終了する複数の機能グループがオブジェクト内に存在できます。最初のグループ (インデックス 0 から開始) はオブジェクト機能を指定します。オブジェクト機能を定義する動的オブジェクトには、セクションに関連した PT_SUNWCAP プログラムヘッダーがあります。このプログラムヘッダーにより、実行時リンカーは、プロセスで利用可能なシステム機能に対してオブジェクトを確認できます。異なるオブジェクト機能を利用する動的オブジェクトは、フィルタを使用して柔軟な実行環境を提供できます。機能固有の共有オブジェクトを参照してください。

追加の機能グループはシンボル機能を指定します。シンボル機能によって、同じシンボルの複数のインスタンスがオブジェクト内に存在できます。各インスタンスは、そのインスタンスを使用するために利用できなければならない一連の機能に関連付けられています。シンボル機能が存在する場合、SHT_SUNW_cap セクションの sh_link 要素は関連の SHT_SUNW_capinfo テーブルを指します。シンボル機能を利用する動的オブジェクトでは、特定のシステム向けに最適化された関数を柔軟に有効化できます。シンボル機能関数ファミリの作成を参照してください。

SHT_SUNW_capinfo テーブルは関連のシンボルテーブルに相当します。SHT_SUNW_capinfo セクションの sh_link 要素は関連のシンボルテーブルを指します。機能に関連付けられた関数は、SHT_SUNW_cap セクション内の機能グループを指定する SHT_SUNW_capinfo テーブル内にインデックスを持ちます。

動的オブジェクト内では、SHT_SUNW_capinfo セクションの sh_info 要素は機能連鎖テーブルである SHT_SUNW_capchain を指します。このテーブルは、実行時リンカーが機能ファミリのメンバーの位置を特定するために使用されます。

SHT_SUNW_capinfo テーブルエントリの形式は次のとおりです。sys/elf.h を参照してください。

typedef Elf32_Word    Elf32_Capinfo;
typedef Elf64_Xword   Elf64_Capinfo;

このテーブル内の要素は、次のマクロを使用して解釈されます。sys/elf.h を参照してください。

#define ELF32_C_SYM(info)       ((info)>>8)
#define ELF32_C_GROUP(info)     ((unsigned char)(info))
#define ELF32_C_INFO(sym, grp)  (((sym)<<8)+(unsigned char)(grp))

#define ELF64_C_SYM(info)       ((info)>>32)
#define ELF64_C_GROUP(info)     ((Elf64_Word)(info))
#define ELF64_C_INFO(sym, grp)  (((Elf64_Xword)(sym)<<32)+(Elf64_Xword)(grp))

SHT_SUNW_capinfo エントリの group 要素には、このシンボルに関連する SHT_SUNW_cap テーブルのインデックスが含まれています。このようにして、この要素はシンボルを機能グループに関連付けます。予約済みのグループインデックスである CAPINFO_SUNW_GLOB は、機能インスタンスファミリの先頭のシンボルを識別して、デフォルトのインスタンスを指定します。

名前
意味
CAPINFO_SUNW_GLOB
0xff
デフォルトのシンボルを特定します。このシンボルは特定の機能に関連付けられていませんが、シンボル機能ファミリの先頭になります。

SHT_SUNW_capinfo エントリの symbol 要素には、このシンボルに関連する先頭のシンボルのインデックスが含まれます。グループとシンボルの情報を使用すると、リンカーは再配置可能オブジェクトから機能シンボルファミリを処理し、すべての出力オブジェクトに必要な機能情報を作成できます。動的オブジェクトでは、グループ CAPINFO_SUNW_GLOB を使用してタグが付けられた先頭のシンボルのシンボル要素が、SHT_SUNW_capchain テーブル内へのインデックスです。このインデックスを使用すると、実行時リンカーは機能連鎖テーブルをこのインデックスからたどり、0 エントリが検出されるまでエントリを次々に検査できます。この連鎖エントリには、機能ファミリメンバーごとにシンボルインデックスが含まれています。

シンボル機能を定義している動的オブジェクトには、DT_SUNW_CAP 動的エントリと DT_SUNW_CAPINFO 動的エントリがあります。これらのエントリは、それぞれ SHT_SUNW_cap セクションと SHT_SUNW_capinfo セクションを特定します。オブジェクトには、SHT_SUNW_capchain セクション、セクションのエントリサイズ、および合計サイズを指定する DT_SUNW_CAPCHAINDT_SUNW_CAPCHAINENT、および DT_SUNW_CAPCHAINSZ の各エントリも含まれます。これらのエントリを使用すると、実行時リンカーはシンボル機能インスタンスファミリから、使用に最適なシンボルを確立できます。

オブジェクトは、オブジェクト機能のみ、シンボル機能のみ、または両方のタイプの機能を定義できます。オブジェクト機能グループはインデックス 0 から開始します。シンボル機能グループは 0 以外のインデックスから開始します。オブジェクトでシンボル機能が定義されているが、オブジェクト機能が定義されていない場合、シンボル機能の開始を示すためにインデックス 0 に 1 つの CA_SUNW_NULL エントリが存在する必要があります。