再配置可能オブジェクトのハードウェア、ソフトウェア、マシン、およびプラットフォームの機能は通常、コンパイル時にオブジェクト内部に記録されます。リンカーは入力再配置可能オブジェクトの機能を組み合わせて、出力ファイルの最終機能セクションを作成します。mapfile 内で機能を定義して、入力再配置可能オブジェクトから指定される機能に追加したり、完全に置き換えたりすることができます。
CAPABILITY [capid] { HW = [hwcap_flag....]; HW += [hwcap_flag....]; HW -= [hwcap_flag....]; HW_1 = [value....]; HW_1 += [value....]; HW_1 -= [value....]; HW_2 = [value....]; HW_2 += [value....]; HW_2 -= [value....]; MACHINE = [machine_name....]; MACHINE += [machine_name....]; MACHINE -= [machine_name....]; PLATFORM = [platform_name....]; PLATFORM += [platform_name....]; PLATFORM -= [platform_name....]; SF = [sfcap_flag....]; SF += [sfcap_flag....]; SF -= [sfcap_flag....]; SF_1 = [value....]; SF_1 += [value....]; SF_1 -= [value....]; };
オプションの capid の名前が存在する場合、この名前はオブジェクト機能のシンボリック名を提供し、結果として出力オブジェクト内に CA_SUNW_ID 機能エントリができます。複数の CAPABILITY 指令が存在する場合、最後の指令の capid が使用されます。
空の CAPABILITY 指令を使用すると、機能の値を何も指定せずにオブジェクト機能の capid を指定できます。
CAPABILITY capid;
各タイプの機能について、リンカーは現在の値 (value) と、除外する一連の値 (exclude ) を保持します。ハードウェアおよびソフトウェア機能の場合、これらの値はビットマスクです。マシンおよびプラットフォームの機能の場合、これらは名前のリストです。mapfile を処理する前に、すべての機能の value および exclude の値がクリアされます。代入演算子の機能を次に示します。
「+=」演算子を使用すると、指定された値はその機能の現在の value に追加され、その機能の exclude 値から削除されます。
「-=」演算子を使用すると、指定された値はその機能の exclude 値に追加され、その機能の現在の value から削除されます。
「=」演算子を使用すると、以前の value は指定された値に置き換わり、exclude が 0 にリセットされます。また、「=」を使用すると、入力ファイル処理から収集されたすべての機能がオーバーライドされます。
入力オブジェクトは mapfile が読み込まれたあとに処理されます。入力オブジェクトによって指定された機能の値は、mapfile からの値とマージされます。ただし、「=」演算子が使用された場合は、入力オブジェクト内に見つかった機能は無視されます。つまり、「=」演算子は入力オブジェクトをオーバーライドし、「+=」演算子は機能を追加します。
結果の機能の値を出力オブジェクトに書き込む前に、リンカーは「-=」演算子で指定されたすべての機能の値を削除します。
指定された機能を出力オブジェクトから完全に除去するには、「=」演算子と空の値リストを使用すれば十分です。たとえば次の例は、入力オブジェクトによって提供されるすべてのハードウェア機能を抑制します。
$mapfile_version 2 CAPABILITY { HW = ; };
ELF オブジェクト内では、ハードウェアとソフトウェアの機能は、オブジェクトの機能セクションから検出される 1 つ以上のビットマスク内でのビット割り当てとして表現されます。HW および SF mapfile 属性は、この実装の抽象的なビューを提供し、リンカーによって適切なマスクおよびビットに変換される、空白区切りのシンボリック機能名のリストを受け入れます。番号付き属性 (HW_1 、HW_2、SF_1) は、ベースとなる機能ビットマスクへの直接数値アクセスを可能にするために存在します。これらは正式に定義されていない機能ビットを指定するために使用できます。可能な場合、HW および SF 属性を使用することをお勧めします。
ハードウェア機能は、空白区切りのシンボリック機能名のリストとして指定されます。SPARC プラットフォームでは、ハードウェア機能は <sys/auxv_SPARC.h> の AV_ の値として定義されます。x86 プラットフォームでは、ハードウェア機能は <sys/auxv_386.h> の AV_ の値として定義されます。mapfile では同じ名前を使用し、AV_ 接頭辞を付けません。たとえば、x86 の AV_SSE ハードウェア機能は mapfile 内では SSE と呼ばれます。このリストには、CA_SUNW_HW_ 機能マスク用に定義されたすべての機能名を含めることができます。
HW_1 および HW_2 属性には、CA_SUNW_HW_1 および CA_SUNW_HW_2 機能マスクを数値として直接指定したり、そのマスクに対応するシンボリックハードウェア機能名として指定したりできます。
MACHINE 属性は、オブジェクトが実行可能なシステムのマシンハードウェア名を指定します。システムのマシンハードウェア名は、ユーティリティー uname(1) に –m オプションを付けて実行すると表示できます。CAPABILITY 指令は複数のマシン名を指定できます。それぞれの名前は出力オブジェクト内の CA_SUNW_MACH 機能エントリになります。
PLATFORM 属性は、オブジェクトが実行可能なシステムのプラットフォーム名を指定します。システムのプラットフォーム名は、ユーティリティー uname(1) に –i オプションを付けて実行すると表示できます。CAPABILITY 指令は複数のプラットフォーム名を指定できます。それぞれの名前は出力オブジェクト内の CA_SUNW_PLAT 機能エントリになります。
ソフトウェア機能は、空白区切りのシンボリック機能名のリストとして指定されます。ソフトウェア機能は、<sys/elf.h> の SF1_SUNW_ の値として定義されます。mapfile では同じ名前を使用し、SF1_SUNW_ 接頭辞を付けません。たとえば、SF1_SUNW_ADDR32 ソフトウェア機能は mapfile 内では ADDR32 と呼ばれます。このリストには、CA_SUNW_SF_1 用に定義されたすべての機能名を含めることができます。
SF_1 属性には、CA_SUNW_SF_1 機能マスクを数値として直接指定したり、そのマスクに対応するシンボリックソフトウェア機能名として指定したりできます。