Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

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

动态标记 $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 不会包括在符号搜索中。