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

文档信息

前言

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

5.  应用程序二进制接口与版本控制

6.  支持接口

7.  目标文件格式

8.  线程局部存储

9.  Mapfile

A.  链接编辑器快速参考

B.  版本控制快速参考

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

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

减少 filtee 搜索

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

减少 filtee 搜索

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

查找关联的依赖项

非绑定产品之间的依赖性

安全

D.  直接绑定

E.  System V 发行版 4(版本 1)Mapfile

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

索引

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

动态标记 $CAPABILITY 可用于指定特定于功能的共享目标文件所在的目录。此标记可用于过滤器和依赖项。由于此标记可以扩展到多个目标文件,因此它与依赖项一起使用时应受到控制。通过 dlopen(3C) 获取的依赖项可以在 RTLD_FIRST 模式下使用此标记。使用此标记的显式依赖项将装入找到的第一个适当的依赖项。


注 - 原始功能实现完全基于硬件功能。标记 $HWCAP 用于选择此功能处理。自从此功能被扩展超出硬件功能后,$HWCAP 标记也已经被 $CAPABILITY 标记取代。出于兼容性方面的考虑,$HWCAP 标记被解释为 $CAPABILITY 标记的别名。


路径名称指定必须包含以 $CAPABILITY 标记结束的全路径名。由 $CAPABILITY 标记指定的目录中的共享目标文件将在运行时受到检查。这些目标文件应指明其功能要求。请参见标识功能要求。将根据可用于此进程的功能验证每个目标文件。适用于进程的那些目标文件按其功能值的降序进行排序。这些已排序的 filtee 用于解析过滤器内定义的符号。

功能目录中的 filtee 在命名方面没有限制。以下示例说明了如何设计辅助过滤器 libfoo.so.1 以使其访问硬件功能 filtee。

$ LD_OPTIONS='-f /opt/ISV/lib/cap/$CAPABILITY' \
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/cap/$CAPABILITY
$ elfdump -H /opt/ISV/lib/cap/*

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

Capabilities Section:  .SUNW_cap

 Object Capabilities:
     index  tag               value
       [0]  CA_SUNW_HW_1     0x1000  [ SSE2 ]

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

Capabilities Section:  .SUNW_cap

 Object Capabilities:
     index  tag               value
       [0]  CA_SUNW_HW_1     0x40  [ MMX ]

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

Capabilities Section:  .SUNW_cap

 Object Capabilities:
     index  tag               value
       [0]  CA_SUNW_HW_1     0x800  [ SSE ]

如果在具有 MMXSSE 硬件功能的系统上处理过滤器 libfoo.so.1,则出现以下 filtee 搜索顺序。

$ 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=cap/filtee.so.2  [ ELF ]
01233: symbol=foo;  lookup in file=cap/filtee.so.1  [ ELF ]
....

请注意,filtee.so.2 的功能值大于 filtee.so.1 的功能值。由于 SSE2 功能不可用,因此 filtee.so.3 不会包括在符号搜索中。

减少 filtee 搜索

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

指定的 $CAPABILITY 目录中的所有共享目标文件都会被检查,以验证其可用性并对找到的那些适用于进程的目标文件进行排序。排序后,将装入所有目标文件以备使用。

可以使用链接编辑器的 -z endfiltee 选项生成 filtee,以指明它是最后一个可用的 filtee。使用此选项标识的 filtee 将终止此过滤器的已排序 filtee 列表。不会为过滤器装入任何排在此 filtee 之后的目标文件。在前面的示例中,如果使用 -z endfiltee 标记了 filter.so.2 filtee,则 filtee 搜索将如下所示:

$ LD_DEBUG=symbols prog
....
01424: symbol=foo;  lookup in file=libfoo.so.1  [ ELF ]
01424: symbol=foo;  lookup in file=cap/filtee.so.2  [ ELF ]
....