映射指令指示链接编辑器如何将输入节映射到输出段。本质上,就是指定要映射到的段,并指明节为了映射到指定的段而必须具备的属性。某个节为映射到特定段而必须具备的 section_attribute_values 集称为此段的入口条件。节必须完全满足段的入口条件,才能置于输出文件的指定段中。
映射指令的语法如下:
segment_name : {section_attribute_value}* [: {file_name}+];
对于 segment_name,可以按任意顺序指定任何数量的 section_attribute_values,其中每个值都由空格进行分隔。每个节属性最多允许具有一个节属性值。还可以通过 file_name 声明指定节必须来自某个特定的 .o 文件。下表列出了节属性及其有效值。
表 9–2 节属性
节属性 |
值 |
---|---|
section_name |
任何有效的节名 |
section_type |
$PROGBITS $SYMTAB $STRTAB $REL $RELA $NOTE $NOBITS |
section_flags |
? [[!]A] [[!]W] [[!]X] |
输入映射指令时,请注意以下几点:
最多只能从上面列出的 section_type 中选择一个 section_type。上面列出的 section_type 是内置类型。有关 section_type 的更多信息,请参见节。
section_flags 值包括 A、W 和 X,分别表示可分配、可写和可执行。如果个别标志之前加有一个叹号 (!),则链接编辑器将检查是否未设置此标志。问号、叹号和构成 section_flags 值的各个标志之间不允许有空格。
file_name 可以是任何形式为 *filename 或 archive_name(component_name) 的合法文件名,例如,/lib/libc.a(printf.o)。链接编辑器不会检查文件名的语法。
如果 file_name 的形式为 *filename,则链接编辑器会模拟从命令行对文件执行 basename(1),并将结果与指定的 file name 进行匹配。换言之,mapfile 中的 filename 只需要与命令行中文件名的最后一部分进行匹配。 请参见映射示例。
如果在链接编辑期间使用 -l 选项,并且 -l 选项之后的库位于当前目录中,则必须在 mapfile 中将 ./ 或整个路径名作为库的前缀,以便创建匹配。
对于特殊的输出段,可能显示多个指令行。例如,以下指令集是合法的:
S1 : $PROGBITS; S1 : $NOBITS;
为一个段输入多个映射指令行是为节属性指定多个值的唯一方法。
一个节可以与多个入口条件匹配。在这种情况下,使用在带有入口条件的 mapfile 中遇到的第一个段。例如,如果 mapfile 显示为:
S1 : $PROGBITS; S2 : $PROGBITS;
则将 $PROGBITS 节映射到 S1 段。