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

退出打印视图

更新时间: 2014 年 7 月
 
 

示例:节到段的分配

此示例说明如何定义段并为其指定输入节。

示例 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.opopcorn.o 的所有数据节。目标文件 popcorn.o 可以来自归档文件,这时归档文件可以具有任意名称。或者,popcorn.o 可以来自具有基名 popcorn.o 的任意文件。与此相反,peanuts.o 只能来自具有该确切名称的文件。例如,提供给链接编辑的文件 /var/tmp/peanuts.opeanuts.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 段是其中一种标准预定义段,如预定义段中所述,因此该语句将修改现有段,而不是创建一个新段。