动态标记 $HWCAP 可用于指定特定于硬件功能的共享库所在的目录。此标记可用于过滤器和依赖项。由于此标记可以扩展到多个目标文件,因此它与依赖项一起使用时应受到控制。通过 dlopen(3C) 获取的依赖项可以在 RTLD_FIRST 模式下使用此标记。使用此标记的显式依赖项将装入找到的第一个适当的依赖项。
路径名称指定必须包含以 $HWCAP 标记结束的全路径名。由 $HWCAP 标记指定的目录中的共享库将在运行时受到检查。这些目标文件应指明其硬件功能要求。 请参见标识硬件和软件功能。将根据可用于此进程的硬件功能验证每个目标文件。适用于进程的那些目标文件按其硬件功能值的降序进行排序。这些已排序的 filtee 用于解析过滤器内定义的符号。
硬件功能目录中的 filtee 在命名方面没有限制。以下示例说明了如何设计辅助过滤器 libfoo.so.1 以使其访问硬件功能 filtee。
$ LD_OPTIONS='-f /opt/ISV/lib/hwcap/$HWCAP' \ 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/hwcap/$HWCAP $ elfdump -H /opt/ISV/lib/hwcap/* /opt/ISV/lib/hwcap/filtee.so.3: Hardware/Software Capabilities Section: .SUNW_cap index tag value [0] CA_SUNW_HW_1 0x1000 [ SSE2 ] /opt/ISV/lib/hwcap/filtee.so.1: Hardware/Software Capabilities Section: .SUNW_cap index tag value [0] CA_SUNW_HW_1 0x40 [ MMX ] /opt/ISV/lib/hwcap/filtee.so.2: Hardware/Software Capabilities Section: .SUNW_cap 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 ..... debug: symbol=foo; lookup in file=libfoo.so.1 [ ELF ] debug: symbol=foo; lookup in file=hwcap/filtee.so.2 [ ELF ] debug: symbol=foo; lookup in file=hwcap/filtee.so.1 [ ELF ] ..... |
请注意,filtee.so.2 的功能值大于 filtee.so.1 的功能值。由于 SSE2 功能不可用,因此 filtee.so.3 不会包括在符号搜索中。
通过在过滤器内使用 $HWCAP,可使一个或多个 filtee 实现过滤器内定义的接口。
指定的 $HWCAP 目录中的所有共享库都会被检查,以验证其可用性并对找到的那些适用于进程的目标文件进行排序。排序后,将装入所有目标文件以备使用。
可以使用链接编辑器的 -z endfiltee 选项生成 filtee,以指明它是最后一个可用的 filtee。使用此选项标识的 filtee 将终止此过滤器的已排序 filtee 列表。不会为过滤器装入任何排在此 filtee 之后的目标文件。在前面的示例中,如果使用 -z endfiltee 标记了 filter.so.2 filtee,则 filtee 搜索将如下所示:
$ LD_DEBUG=symbols prog ..... debug: symbol=foo; lookup in file=libfoo.so.1 [ ELF ] debug: symbol=foo; lookup in file=hwcap/filtee.so.2 [ ELF ] ..... |