JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

8.  mapfile

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

特定于功能的共享目标文件

减少 filtee 搜索

特定于指令集的共享目标文件

减少 filtee 搜索

特定于系统的共享目标文件

查找关联的依赖项

非绑定产品之间的依赖性

安全性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)mapfile

索引

特定于指令集的共享目标文件

将在运行时扩展动态标记 $ISALIST,以反映可在此平台上执行的本机指令集,如实用程序 isalist(1) 所示。此标记可用于过滤器、运行路径定义和依赖项。由于此标记可以扩展到多个目标文件,因此它与依赖项一起使用时应受到控制。通过 dlopen(3C) 获取的依赖项可以在 RTLD_FIRST 模式下使用此标记。使用此标记的显式依赖项将装入找到的第一个适当的依赖项。


注 - 该标记已废弃,以后的 Oracle Solaris 版本中将不再包括。有关处理指令集扩展名的建议技术,请参见特定于功能的共享目标文件


引入 $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

或者,在配置了 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 搜索。在前面的 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