此示例说明如何定义段并为其指定输入节。
示例 8-1 基本节到段的分配1 $mapfile_version 2 2 LOAD_SEGMENT elephant { 3 ASSIGN_SECTION { 4 IS_NAME=.data; 5 FILE_PATH=peanuts.o; 6 }; 7 ASSIGN_SECTION { 8 IS_NAME=.data; 9 FILE_OBJNAME=popcorn.o; 10 }; 11 }; 12 13 LOAD_SEGMENT monkey { 14 VADDR=0x80000000; 15 MAX_SIZE=0x4000; 16 ASSIGN_SECTION { 17 TYPE=progbits; 18 FLAGS=ALLOC EXECUTE; 19 }; 20 ASSIGN_SECTION { 21 IS_NAME=.data 22 }; 23 }; 24 25 LOAD_SEGMENT donkey { 26 FLAGS=READ EXECUTE; 27 ALIGN=0x1000; 28 ASSIGN_SECTION { 29 IS_NAME=.data; 30 }; 31 }; 32 33 LOAD_SEGMENT text { 34 VADDR=0x80008000 35 };
在此示例中处理四个单独的段。每个 mapfile 都以一个 $mapfile_version 声明开始,如行 1 所示。段 elephant(行 2-11)接收来自文件 peanuts.o 或 popcorn.o 的所有数据节。目标文件 popcorn.o 可以来自归档文件,这时归档文件可以具有任意名称。或者,popcorn.o 可以来自具有基名 popcorn.o 的任意文件。与此相反,peanuts.o 只能来自具有该确切名称的文件。例如,提供给链接编辑的文件 /var/tmp/peanuts.o 与 peanuts.o 并不匹配。
段 monkey(行 13-23)具有一个虚拟地址 0x80000000 和最大长度 0x4000。此段接收类型为 PROGBITS 且可分配、可执行的所有节,以及尚未在段 elephant 中的名为 .data 的所有节。进入 monkey 段的 .data 节不需要是 PROGBITS 或是可分配、可执行的,因为它们与第 20 行而不是第 16 行上的入口条件相匹配。这表明 ASSIGN_SECTION 属性中的子属性之间存在 and(与)关系,而单个段的不同 ASSIGN_SECTION 属性之间存在 or(或)关系。
donkey 段(行 25-31)指定了非缺省权限标志和对齐方式,并将接受名为 .data 的所有节。但是,此段不会指定任何节,因此,段 donkey 永远不会出现在输出目标文件中。其原因是链接编辑器按照入口条件在 mapfile 中出现的顺序对其进行检查。在此 mapfile 中,段 elephant 接受某些 .data 节,段 monkey 接受其余的所有节,而没有为 donkey 留下任何节。
行 33-35 将 text 段的虚拟地址设置为 0x80008000。text 段是其中一种标准预定义段,如预定义段中所述,因此该语句将修改现有段,而不是创建一个新段。