ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
リンカーとライブラリ Oracle Solaris 11 Information Library (日本語) |
動的トークン $CAPABILITY を使用すると、機能固有の共有オブジェクトがあるディレクトリを指定できます。このトークンは、フィルタまたは依存関係に対して使用できます。このトークンは複数のオブジェクトに拡張できるので、依存関係と使用する場合も管理できます。dlopen(3C) で取得された依存関係は、RTLD_FIRST モードでこのトークンを使用できます。このトークンを使用する明示的な依存関係は、最初に見つかった適切な依存関係を読み込みます。
注 - 元の機能はハードウェア機能のみに基づいて実装されました。トークン $HWCAP は、この機能処理を選択するために使用されました。それ以降、ハードウェア機能を超えて機能が拡張されたため、$HWCAP トークンは $CAPABILITY トークンで置き換えられました。互換性については、$HWCAP トークンは $CAPABILITY トークンの別名として解釈されます。
パス名の指定は、$CAPABILITY トークンで終わるフルパス名で構成する必要があります。$CAPABILITY トークンで指定されたディレクトリ内の共有オブジェクトは、実行時に検査されます。これらのオブジェクトは、機能の要件を示す必要があります。「機能要件の特定」を参照してください。各オブジェクトは、プロセスで使用可能な機能に対して検証されます。プロセスで使用できるオブジェクトは、機能値の降順で保存されます。これらのソートされたフィルティーは、フィルタ内で定義されたシンボルを解決するために使用されます。
機能ディレクトリ内のフィルティーには、命名に関する制限はありません。次の例で、ハードウェア機能フィルティーにアクセスするために補助フィルタ libfoo.so.1 をどのように設計するかを示します。
$ LD_OPTIONS='-f /opt/ISV/lib/cap/$CAPABILITY' \ cc -o libfoo.so.1 -G -K pic -h libfoo.so.1 -R. foo.c $ elfdump -d libfoo.so.1 | egrep 'SONAME|AUXILIARY' [2] SONAME 0x1 libfoo.so.1 [3] AUXILIARY 0x96 /opt/ISV/lib/cap/$CAPABILITY $ elfdump -H /opt/ISV/lib/cap/* /opt/ISV/lib/cap/filtee.so.3: Capabilities Section: .SUNW_cap Object Capabilities: index tag value [0] CA_SUNW_HW_1 0x1000 [ SSE2 ] /opt/ISV/lib/cap/filtee.so.1: Capabilities Section: .SUNW_cap Object Capabilities: index tag value [0] CA_SUNW_HW_1 0x40 [ MMX ] /opt/ISV/lib/cap/filtee.so.2: Capabilities Section: .SUNW_cap Object Capabilities: index tag value [0] CA_SUNW_HW_1 0x800 [ SSE ]
フィルタ libfoo.so.1 を MMX と SSE のハードウェア機能を使用できるシステムで処理した場合、次のフィルティー検索順序が採用されます。
$ cc -o prog prog.c -R. -lfoo $ LD_DEBUG=symbols prog .... 01233: symbol=foo; lookup in file=libfoo.so.1 [ ELF ] 01233: symbol=foo; lookup in file=cap/filtee.so.2 [ ELF ] 01233: symbol=foo; lookup in file=cap/filtee.so.1 [ ELF ] ....
なお、filtee.so.2 の機能値は filtee.so.1 の機能値より大きくなります。SSE2 機能を使用できないので、filtee.so.3 がシンボル検索に含まれる可能性はありません。
フィルタ内で $CAPABILITY を使用すると、1 つまたは複数の「フィルティー」が、フィルタ内で定義されたインタフェースの実装を提供できます。
指定された $CAPABILITY ディレクトリ内のすべての共有オブジェクトは、使用可能性を検証したり、プロセスに適したものをソートしたりするために点検されます。ソートされると、すべてのオブジェクトは使用準備のため読み込まれます。
リンカーの -z endfiltee オプションを使用して「フィルティー」を作成して、これが使用可能な最後の「フィルティー」であることを示します。このオプションで特定されたフィルティーは、そのフィルタのフィルティーのソートリストを終了します。このフィルティーをフィルタに対して読み込んだ後は、いかなるオブジェクトもソートされません。前の例で filter.so.2 フィルティーに -z endfiltee のタグが付けられている場合、フィルティー検索は次のようになります。
$ LD_DEBUG=symbols prog .... 01424: symbol=foo; lookup in file=libfoo.so.1 [ ELF ] 01424: symbol=foo; lookup in file=cap/filtee.so.2 [ ELF ] ....