链接程序和库指南

标识硬件功能

目标文件的硬件功能标识目标文件正常执行要满足的平台硬件要求。例如,要求可能是,标识需要在某些 x86 体系结构上可用的 MMXSSE 功能的代码。

可以使用以下 mapfile 语法标识硬件功能要求:


hwcap_1 = TOKEN | Vval [ OVERRIDE ];

使用一个或多个标记限定 hwcap_1 声明,这些标记是硬件功能的符号表示。此外,通过在值前面加上 V 作为前缀可以提供表示多个功能中的某个功能的数值。对于 SPARC 平台,硬件功能定义为 sys/auxv_SPARC.h 中的 AV_ 值。对于 x86 平台,硬件功能定义为 sys/auxv_386.h 中的 AV_ 值。

以下 x86 示例说明如何将 MMXSSE 声明为目标文件 foo.so.1 需要的硬件功能。


$ egrep "MMX|SSE" /usr/include/sys/auxv_386.h

#define AV_386_MMX    0x0040

#define AV_386_SSE    0x0800

$ cat mapfile

hwcap_1 = SSE MMX;

$ cc -o foo.so.1 -G -K pic -Mmapfile foo.c -lc

$ elfdump -H foo.so.1



Hardware/Software Capabilities Section:  .SUNW_cap

     index  tag               value

       [0]  CA_SUNW_HW_1     0x840  [ SSE  MMX ]

可重定位目标文件可以包含硬件功能值。链接编辑器可以合并多个输入可重定位目标文件中的任何硬件功能值。生成的 CA_SUNW_HW_1 值是对关联的输入值进行按位或运算的结果。缺省情况下,这些值与 mapfile 指定的硬件功能合并。

可以使用 OVERRIDE 关键字在 mapfile 中显式控制输出文件的硬件功能要求。OVERRIDE 关键字和硬件功能值 0 可有效地从要生成的目标文件中删除任何硬件功能要求。


$ elfdump -H foo.o



Hardware/Software Capabilities Section:  .SUNW_cap

     index  tag               value

       [0]  CA_SUNW_HW_1     0x840  [ SSE  MMX ]

$ cat mapfile

hwcap_1 = V0x0 OVERRIDE;

$ cc -o bar.o -r -Mmapfile foo.o

$ elfdump -H bar.o

$ 

运行时链接程序会针对进程可用的硬件功能验证目标文件定义的任何硬件功能要求。如果无法满足任何硬件功能要求,则不会在运行时装入该目标文件。例如,如果进程不能使用 SSE 功能,则 ldd(1) 将指示以下错误。


$ ldd prog

         foo.so.1 =>     ./foo.so.1  - hardware capability unsupported: \

                         0x800 [ SSE ]

         libc.so.1 =>    /lib/libc.so.1

利用不同硬件功能的动态库可以使用过滤器提供灵活的运行时环境。 请参见特定于硬件功能的共享库