リンカーとライブラリ

ハードウェア機能固有の共有オブジェクト

動的トークン $HWCAP を使用して、ハードウェア機能固有の共有オブジェクトがあるディレクトリを指定することができます。このトークンは、フィルタまたは依存関係に対して使用できます。このトークンは複数のオブジェクトに拡張できるので、依存関係と使用する場合も管理できます。dlopen(3C) で取得された依存関係は、RTLD_FIRST モードでこのトークンを使用できます。このトークンを使用する明示的な依存関係は、最初に見つかった適切な依存関係を読み込みます。

パス名の指定は、$HWCAP トークンで終わるフルパス名で構成する必要があります。$HWCAP トークンで指定されたディレクトリ内の共有オブジェクトは、実行時に検査されます。これらのオブジェクトは、ハードウェア機能の要件を示す必要があります。「ハードウェアとソフトウェア機能の特定」を参照してください。各オブジェクトは、プロセスで使用可能なハードウェア機能に対して検証されます。プロセスと使用できるオブジェクトは、ハードウェア機能値の降順で保存されます。これらのソートされたフィルティーは、フィルタ内で定義されたシンボルを解決するために使用されます。

ハードウェア機能ディレクトリ内のフィルティーには、命名に関する制限はありません。次の例で、ハードウェア機能フィルティーにアクセスするために補助フィルタ libfoo.so.1 をどのように設計するかを示します。


$ LD_OPTIONS='-f /opt/ISV/lib/hwcap/$HWCAP' \
cc -o libfoo.so.1 -G -K pic -h libfoo.so.1 -R. foo.c
$ dump -Lv libfoo.so.1 | egrep "SONAME|AUXILIARY"
  [1]    SONAME    libfoo.so.1
  [2]    AUXILIARY /opt/ISV/lib/hwcap/$HWCAP
$ elfdump -H /opt/ISV/lib/hwcap/*

/opt/ISV/lib/hwcap/filtee.so.3:

Hardware/Software Capabilities Section:  .SUNW_cap
     index  tag               value
       [0]  CA_SUNW_HW_1     0x1000  [ SSE2 ]

/opt/ISV/lib/hwcap/filtee.so.1:

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

/opt/ISV/lib/hwcap/filtee.so.2:

Hardware/Software Capabilities Section:  .SUNW_cap
     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=hwcap/filtee.so.2  [ ELF ]
01233: symbol=foo;  lookup in file=hwcap/filtee.so.1  [ ELF ]
.....

なお、filtee.so.2 の機能値は filtee.so.1 の機能値より大きくなります。SSE2 機能を使用できないので、filtee.so.3 がシンボル検索に含まれる可能性はありません。

「フィルティー」検索の縮小

フィルタ内で $HWCAP を使用すると、1 つまたは複数の「フィルティー」が、フィルタ内で定義されたインタフェースの実装を提供できます。

指定された $HWCAP ディレクトリ内のすべての共有オブジェクトは、使用可能性を検証し、プロセスに適したものをソートするために、点検されます。ソートされると、すべてのオブジェクトは使用準備のため読み込まれます。

リンカーの -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=hwcap/filtee.so.2  [ ELF ]
.....