链接程序和库指南

特定于指令集的共享库

将在运行时扩展动态标记 $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

$ 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'/opt/ISV/lib/$ISALIST' foo.c

$ dump -Lv libfoo.so.1 | egrep "RUNPATH|AUXILIARY"

  [1]    RUNPATH   /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

或者,在配置了 MMXPentium 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

减少 filtee 搜索

通过在过滤器内使用 $ISALIST,可使一个或多个 filtee 实现过滤器内定义的接口。

过滤器内定义的任何接口都可能导致全面搜索所有可能的 filtee,以尝试找到所需接口。如果使用 filtee 以提供性能关键的功能,则这种全面的 filtee 搜索可能会对效率带来负面影响。

可以使用链接编辑器的 -z endfiltee 选项生成 filtee,以指明它是最后一个可用的 filtee。此选项将终止该过滤器的任何进一步 filtee 搜索。在前面的示例中,如果存在 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