Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

機能固有の共有オブジェクト

動的トークン $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.1MMXSSE のハードウェア機能を使用できるシステムで処理した場合、次のフィルティー検索順序が採用されます。

$ 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 ]
....