JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 链接程序和库指南     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

8.  Mapfile

Mapfile 结构和语法

Mapfile 版本

条件输入

指令语法

Mapfile 指令

CAPABILITY 指令

HW 属性

HW_1 / HW_2 属性

MACHINE 属性

PLATFORM 属性

SF 属性

SF_1 属性

DEPEND_VERSIONS 指令

ALLOW 属性

REQUIRE 属性

HDR_NOALLOC 指令

PHDR_ADD_NULL 指令

LOAD_SEGMENT / NOTE_SEGMENT / NULL_SEGMENT 指令

ALIGN 属性(仅限 LOAD_SEGMENT)

ASSIGN_SECTION 属性

DISABLE 属性

FLAGS 属性(仅限 LOAD_SEGMENT)

IS_ORDER 属性

MAX_SIZE 属性(仅限 LOAD_SEGMENT)

NOHDR 属性(仅限 LOAD_SEGMENT)

OS_ORDER 属性

PADDR 属性(仅限 LOAD_SEGMENT)

ROUND 属性(仅限 LOAD_SEGMENT)

SIZE_SYMBOL 属性(仅限 LOAD_SEGMENT)

VADDR(仅限 LOAD_SEGMENT)

SEGMENT_ORDER 指令

STACK 指令

STUB_OBJECT 指令

SYMBOL_SCOPE / SYMBOL_VERSION 指令

ASSERT 属性

AUXILIARY 属性

FILTER 属性

FLAGS 属性

SIZE 属性

TYPE 属性

VALUE 属性

预定义段

映射示例

示例:节到段的分配

示例:预定义节的修改

链接编辑器内部:节和段的处理

节到段的分配

预定义段和入口条件的 Mapfile 指令

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)Mapfile

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

映射示例

下面是用户定义的 mapfile 示例。示例中左边的编号用于教学演示。实际上只有编号右边的信息会出现在 mapfile 中。

示例:节到段的分配

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

示例 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 段是其中一种标准预定义段,如预定义段中所述,因此该语句将修改现有段,而不是创建一个新段。

示例:预定义节的修改

以下 mapfile 示例将处理预定义的 text 和 data 段、头选项以及排序段中的节。

示例 8-2 预定义节的处理和节到段的分配

        1    $mapfile_version 2
        2    HDR_NOALLOC;
        3
        4    LOAD_SEGMENT text {
        5            VADDR=0xf0004000;
        6            FLAGS=READ EXECUTE;
        7            OS_ORDER=.text .rodata;
        9            ASSIGN_SECTION {
       10                   TYPE=PROGBITS;
       11                   FLAGS=ALLOC !WRITE;
       12           };
       13   };
       14
       15   LOAD_SEGMENT data {
       16           FLAGS=READ WRITE EXECUTE;
       17           ALIGN=0x1000;
       18           ROUND=0x1000;
       19   };

与往常一样,第一行声明要使用的 mapfile 语言版本。HDR_NOALLOC 指令(行 2)指定所获得的目标文件不应在目标文件的第一个可分配段中包含 ELF 头或程序头数组,该段是预定义的 text 段。

行 4-13 中的段指令为 text 段设置虚拟地址和权限标志。该指令还指定名为 .text 的节应放在段的开头,后跟任何名为 .rodata 的节,再后面是所有其他节。最后将可分配、非可写的 PROGBITS 节指定给该段。

行 15-19 中的段指令指定 data 段必须在边界 0x1000 上对齐。其效果是以相同的对齐方式对齐段中的第一个节。段的长度将向上舍入为与对齐方式相同的值的倍数。段权限设置为读取、写入和执行。