跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 链接程序和库指南 Oracle Solaris 11.1 Information Library (简体中文) |
动态标记 $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 ]
如果在具有 MMX 和 SSE 硬件功能的系统上处理过滤器 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 不会包括在符号搜索中。
通过在过滤器内使用 $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 ] ....