動的トークン $ISALIST は、実行時に拡張され、このプラットフォームで実行可能なネイティブの命令セットを反映します。この様子はユーティリティ isalist(1) によって表されます。
$ISALIST トークンを持つあらゆるストリング名は、それぞれ使用できる命令セットの 1 つを割り当てられた複数の文字列に効率良くコピーされます。このトークンは、「フィルタ」あるいは「実行パス」指定でのみ使用できます。
次の例では、命令セット固有のフィルティー libfoo.so.1 にアクセスするように補助フィルタ libbar.so.1 を設計する方法を示します。
$ LD_OPTIONS='-f /opt/ISV/lib/$ISALIST/libbar.so.1' ¥ 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/$ISALIST/libbar.so.1 |
あるいは、代わりに「実行パス」を使用することができます。
$ LD_OPTIONS='-f libbar.so.1' ¥ cc -o libfoo.so.1 -G -K pic -h libfoo.so.1 -R'/ot/ISV/lib/$ISALIST' foo.c $ dump -Lv libfoo.so.1 | egrep "RPATH|AUXILIARY" [1] RPATH /opt/ISV/lib/$ISALIST [2] AUXILIARY libbar.so.1 |
どちらの場合でも、実行時リンカーはプラットフォームで使用可能な命令リストを使用して、複数の検索パスを構成します。たとえば、次のアプリケーションは libfoo.so.1 に依存関係があり、SUNW,Ultra-2 上で実行されます。
$ ldd -ls prog ..... find object=libbar.so.1; required by ./libfoo.so.1 search path=/opt/ISV/lib/$ISALIST (RPATH from file ./libfoo.so.1) trying path=/opt/ISV/lib/sparcv9+vis/libbar.so.1 trying path=/opt/ISV/lib/sparcv9/libbar.so.1 trying path=/opt/ISV/lib/sparcv8plus+vis/libbar.so.1 trying path=/opt/ISV/lib/sparcv8plus/libbar.so.1 trying path=/opt/ISV/lib/sparcv8/libbar.so.1 trying path=/opt/ISV/lib/sparcv8-fsmuld/libbar.so.1 trying path=/opt/ISV/lib/sparcv7/libbar.so.1 trying path=/opt/ISV/lib/sparc/libbar.so.1 |
また、同じ依存関係を持つアプリケーションは、MMX 設計の Pentium Pro で実行されます。
$ ldd -ls prog ..... find object=libbar.so.1; required by ./libfoo.so.1 search path=/opt/ISV/lib/$ISALIST (RPATH from file ./libfoo.so.1) trying path=/opt/ISV/lib/pentium_pro+mmx/libbar.so.1 trying path=/opt/ISV/lib/pentium_pro/libbar.so.1 trying path=/opt/ISV/lib/pentium+mmx/libbar.so.1 trying path=/opt/ISV/lib/pentium/libbar.so.1 trying path=/opt/ISV/lib/i486/libbar.so.1 trying path=/opt/ISV/lib/i386/libbar.so.1 trying path=/opt/ISV/lib/i86/libbar.so.1 |
補助フィルタ内で $ISALIST を使用すると、1 つあるいは複数のフィルティーが、フィルタ内で定義されたインタフェースの代替の実装を提供できます。
ただし、フィルタで定義されたインタフェースにフィルティーで定義された代替の実装がない場合は、要求されたインタフェースの場所を探すために、可能性のあるフィルティーすべてを徹底的に検索する結果となります。性能が重要となる機能を提供するためにフィルティーを使用する場合には、徹底的にフィルティーを検索することによって生産性が下がることがあります。
リンカーの -z endfiltee オプションを使用してフィルティーを作成し、それが使用可能な最後のフィルティーであると指定し、そのフィルタについてそれ以上のフィルティー検索を行わないようにできます。たとえば、前の SPARC の例で、sparcv9 フィルティーが存在し、-z endfiltee のタグが付いている場合、フィルティー検索は次のようになります。
$ ldd -ls prog ..... find object=libbar.so.1; required by ./libfoo.so.1 search path=/opt/ISV/lib/$ISALIST (RPATH from file ./libfoo.so.1) trying path=/opt/ISV/lib/sparcv9+vis/libbar.so.1 trying path=/opt/ISV/lib/sparcv9/libbar.so.1 |