通常在编译时会在目标文件中记录可重定位目标文件的硬件、软件、计算机和平台功能。链接编辑器结合所有输入可重定位目标文件的功能来创建输出文件的最终功能节。可以在 mapfile 中定义功能以扩充或完全取代由输入可重定位目标文件提供的功能。
CAPABILITY [capid] { HW = [hwcap_flag....]; HW += [hwcap_flag....]; HW -= [hwcap_flag....]; HW_1 = [value....]; HW_1 += [value....]; HW_1 -= [value....]; HW_2 = [value....]; HW_2 += [value....]; HW_2 -= [value....]; MACHINE = [machine_name....]; MACHINE += [machine_name....]; MACHINE -= [machine_name....]; PLATFORM = [platform_name....]; PLATFORM += [platform_name....]; PLATFORM -= [platform_name....]; SF = [sfcap_flag....]; SF += [sfcap_flag....]; SF -= [sfcap_flag....]; SF_1 = [value....]; SF_1 += [value....]; SF_1 -= [value....]; };
如果存在可选的 capid 名称,则它可以为目标文件功能提供一个符号名称,从而在输出目标文件中获得一个 CA_SUNW_ID 功能项。如果发现多个 CAPABILITY 指令,则会使用最后一个指令提供的 capid。
可以使用空 CAPABILITY 指令为目标文件功能指定一个 capid 而不指定任何功能值。
CAPABILITY capid;
对于每种功能类型,链接编辑器会维护一个当前值 (value) 和一组要排除的值 (exclude)。对于硬件和软件功能,这些值是位掩码。对于计算机和平台功能,它们是名称列表。在处理 mapfile 之前,必须清除所有功能的 value 和 exclude 值。赋值运算符的工作方式如下。
如果使用 "+=" 运算符,则指定值将添加到该功能的当前 value 中,并从该功能的 exclude 值中删除。
如果使用 "-=" 运算符,则指定值将添加到该功能的 exclude 值中,并从该功能的当前 value 中删除。
如果使用 "=" 运算符,则指定值将替换之前的 value,并且 exclude 将重置为 0。此外,使用 "=" 将覆盖通过输入文件处理收集的任何功能。
输入目标文件在读取 mapfile 后进行处理。输入目标文件指定的功能值将与来自 mapfile 的值合并,除非使用 "=" 运算符,在这种情况下,在输入目标文件中遇到时将忽略该功能。因此,"=" 运算符将覆盖输入目标文件,而 "+=" 运算符则用于扩充它们。
在将所获得的功能值写入到输出目标文件之前,链接编辑器会减去使用 "-=" 运算符指定的任何功能值。
要从输出目标文件中完全排除某个给定功能,使用 "=" 运算符和一个空值列表已足够。例如,以下示例将抑制输入目标文件提供的任何硬件功能:
$mapfile_version 2 CAPABILITY { HW = ; };
在 ELF 目标文件中,硬件和软件功能表示为目标文件功能节中的一个或多个位掩码中的位赋值。HW 和 SF mapfile 属性提供了这一实现的更抽象的视图,即接受一个空格分隔的符号功能名称列表,链接编辑器会将其转换为相应掩码和位。带有编号的属性(HW_1、HW_2、SF_1)旨在允许对底层功能位掩码进行直接数字访问。它们可用于指定尚未正式定义的功能位。如有可能,则建议使用 HW 和 SF 属性。
硬件功能指定为一个空格分隔的符号功能名称列表。对于 SPARC 平台,硬件功能定义为 <sys/auxv_SPARC.h> 中的 AV_ 值。对于 x86 系统,硬件功能定义为 <sys/auxv_386.h> 中的 AV_ 值。mapfile 使用相同的名称,但不带 AV_ 前缀。例如,x86 AV_SSE 硬件功能在 mapfile 中称为 SSE。该列表可以包含为 CA_SUNW_HW_ 功能掩码定义的任意功能名称。
HW_1 和 HW_2 属性允许将 CA_SUNW_HW_1 和 CA_SUNW_HW_2 功能掩码直接指定为数字值,或者指定为与该掩码相对应的符号硬件功能名称。
MACHINE 属性指定目标文件可在其中执行的系统的计算机硬件名称。可通过实用程序 uname(1) 和 –m 选项显示系统的计算机硬件名称。一个 CAPABILITY 指令可以指定多个计算机名称。每个名称将在输出目标文件中获得一个 CA_SUNW_MACH 功能项。
PLATFORM 属性指定目标文件可在其中执行的系统的平台名称。可通过实用程序 uname(1) 和 –i 选项显示系统的平台名称。一个 CAPABILITY 指令可以指定多个平台名称。每个名称将在输出目标文件中获得一个 CA_SUNW_PLAT 功能项。
软件功能指定为一个空格分隔的符号功能名称列表。软件功能定义为 <sys/elf.h> 中的 SF1_SUNW_ 值。Mapfile 使用相同的名称,但不带 SF1_SUNW_ 前缀。例如,SF1_SUNW_ADDR32 软件功能在 mapfile 中称为 ADDR32。该列表可以包含为 CA_SUNW_SF_1 定义的任意功能名称。
SF_1 属性允许将 CA_SUNW_SF_1 功能掩码直接指定为数字值,或者指定为与该掩码相对应的符号软件功能名称。