リンカーとライブラリ

ハードウェア機能の特定

オブジェクトのハードウェア機能は、オブジェクトを正しく実行するために必要なプラットフォームのハードウェア要件を特定します。この要件の例としては、一部の x86 アーキテクチャーで利用できる MMX または SSE を必要とするコードの特定があります。

ハードウェア機能要件は、次の mapfile 構文を使用して特定できます。


hwcap_1 = TOKEN | Vval [ OVERRIDE ];

hwcap_1 宣言は 1 つ以上のトークンで修飾されます。これはハードウェア機能のシンボル表現です。さらに、別の方法として、より多くの機能の 1 つを表す数値に V という接頭辞をつけて指定できます。SPARC プラットフォームでは、ハードウェア機能は sys/auxv_SPARC.hAV_ の値として定義されます。x86 プラットフォームでは、ハードウェア機能は sys/auxv_386.hAV_ の値として定義されます。

次の x86 の例では、オブジェクト foo.so.1 に必要なハードウェア機能として MMXSSE が宣言されています。


$ egrep "MMX|SSE" /usr/include/sys/auxv_386.h
#define AV_386_MMX    0x0040
#define AV_386_SSE    0x0800
$ cat mapfile
hwcap_1 = SSE MMX;
$ cc -o foo.so.1 -G -K pic -Mmapfile foo.c -lc
$ elfdump -H foo.so.1

Hardware/Software Capabilities Section:  .SUNW_cap
     index  tag               value
       [0]  CA_SUNW_HW_1     0x840  [ SSE  MMX ]

再配置可能オブジェクトには、ハードウェア機能の値を含めることができます。リンカーは、複数の入力再配置可能オブジェクトからのハードウェア機能値を組み合わせます。この結果生じる CA_SUNW_HW_1 の値は、関連入力値のビット単位の OR となります。デフォルトでは、これらの値は、mapfile で指定されたハードウェア機能と組み合わせられます。

出力ファイルのハードウェア機能要件は、OVERRIDE キーワードを使用して mapfile から明示的に制御できます。OVERRIDE キーワードは、ハードウェア機能値 0 とともに、構築中のオブジェクトからハードウェア機能要件を事実上削除します。


$ elfdump -H foo.o

Hardware/Software Capabilities Section:  .SUNW_cap
     index  tag               value
       [0]  CA_SUNW_HW_1     0x840  [ SSE  MMX ]
$ cat mapfile
hwcap_1 = V0x0 OVERRIDE;
$ cc -o bar.o -r -Mmapfile foo.o
$ elfdump -H bar.o
$ 

オブジェクトが定義したハードウェア機能要件は、実行時リンカーによってプロセスで利用できるハードウェア機能に対して検証されます。ハードウェア機能要件の一部を満足できない場合、そのオブジェクトは実行時に読み込みされません。たとえば、SSE 機能がプロセスで利用できない場合、ldd(1) は次のエラーを示します。


$ ldd prog
        foo.so.1 =>      ./foo.so.1  - hardware capability unsupported: \
                         0x800 [ SSE ]
        ....

異なるハードウェア機能を利用する動的オブジェクトは、フィルタを使用して柔軟な実行時環境を提供できます。「ハードウェア機能固有の共有オブジェクト」を参照してください。