将在运行时扩展动态标记 $ISALIST,以反映可在此平台上执行的本机指令集,如实用程序 isalist(1) 所示。此标记可用于过滤器、运行路径定义和依赖项。由于此标记可以扩展到多个目标文件,因此它与依赖项一起使用时应受到控制。通过 dlopen(3C) 获取的依赖项可以在 RTLD_FIRST 模式下使用此标记。使用此标记的显式依赖项将装入找到的第一个适当的依赖项。
引入 $ISALIST 标记的任何字符串名称将有效地复制到多个字符串中。并且会为每个字符串指定一个可用的指令集。
以下示例说明了如何设计辅助过滤器 libfoo.so.1 以使其访问特定于指令集的 filtee 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 $ elfdump -d libfoo.so.1 | egrep 'SONAME|AUXILIARY' [2] SONAME 0x1 libfoo.so.1 [3] AUXILIARY 0x96 /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'/opt/ISV/lib/$ISALIST' foo.c $ elfdump -d libfoo.so.1 | egrep 'RUNPATH|AUXILIARY' [3] AUXILIARY 0x96 libbar.so.1 [4] RUNPATH 0xa2 /opt/ISV/lib/$ISALIST
在这两种情况下,运行时链接程序均使用平台上可用的指令列表来构造多个搜索路径。例如,以下应用程序依赖于 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,可使一个或多个 filtee 实现过滤器内定义的接口。
过滤器内定义的任何接口都可能导致全面搜索所有可能的 filtee,以尝试找到所需接口。如果使用 filtee 以提供性能关键的功能,则这种全面的 filtee 搜索可能会对效率带来负面影响。
可以使用链接编辑器的 -z endfiltee 选项生成 filtee,以指明它是最后一个可用的 filtee。此选项将终止该过滤器的任何进一步 filtee 搜索。在前面的 SPARC 示例中,如果存在 SPARCV9 filtee,并且它使用了 -z endfiltee 标记,则 filtee 搜索将如下所示:
$ 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