JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 8/11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

5.  应用程序二进制接口与版本控制

6.  支持接口

7.  目标文件格式

8.  线程局部存储

9.  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 指令

A.  链接编辑器快速参考

B.  版本控制快速参考

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

D.  直接绑定

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

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

索引

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

下面说明链接编辑器用来将节指定给输出段的内部过程。这些信息并不是使用 mapfile 所必需的。这些信息主要提供给对链接编辑器的内部过程感兴趣的读者,以及希望进一步了解链接编辑器如何解释和执行段的 mapfile 指令的读者。

节到段的分配

将输入节分配给输出段的过程涉及以下数据结构。

对于写入到输出目标文件中的每个节,链接编辑器将执行以下步骤,以便将节放入输出段中。

  1. 节的属性将与内部入口条件列表中的每个记录进行比较,从列表的开头开始,依次考虑每个入口条件。当入口条件中的每个属性都精确匹配时,则表示匹配,并且不会禁用与该入口条件相关联的段。搜索将在匹配的第一个入口条件处停止,并且节将定向到关联的段。

    如果不与任何入口条件匹配,则将节放置在输出文件的末尾(位于所有其他段之后)。不会为此信息创建任何程序头项。多数非可分配节(例如调试节)都结束于此区域。

  2. 当节位于段下时,链接编辑器会检查此段中现有输出节的列表,方式如下:

    如果节属性值与现有输出节的属性值完全匹配,则将此节放置在与该输出节关联的节列表的末尾。

    如果未找到匹配的输出节,则使用要放置的节的属性创建一个新输出节,并将输入节放在新输出节中。此新输出节位于段内具有相同节类型的任何其他输出节之后,如果没有相同类型的其他输出节,则位于段的末尾。


    注 - 如果输入节的用户定义的节类型值介于 SHT_LOUSERSHT_HIUSER 之间,则将其视为 PROGBITS 节。没有在 mapfile 中命名此节类型值的方法,但可以使用入口条件中指定的其他属性值(节标志、节名称)重定向这些节。


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

链接编辑器提供一组预定义的输出段描述符和入口条件,如预定义段中所述。链接编辑器已经知道这些节,因此创建这些节无需 mapfile 指令。所显示的可用于生成它们的 mapfile 指令仅为提供说明,并作为相对复杂的 mapfile 规范的一个示例。可以使用 Mapfile 段指令修改或扩充这些内置定义。

通常,节到段的分配可在单个段指令中完成。但是,预定义节具有更复杂的要求,即要求按照不同于段在内存中的布局顺序处理这些节的入口条件。为此可以使用两个过程,第一个用于按照所需顺序定义所有段,第二个用于按照实现所需结果的顺序建立入口条件。用户 mapfile 很少需要采用此策略。

        # Predefined segments and entrance criteria for the Oracle Solaris
        # link-editor
        $mapfile_version 2

        # The lrodata and ldata segments only apply to x86-64 objects.
        # Establish amd64 as a convenient token for conditional input
        $if _ELF64 && _x86
        $add amd64
        $endif

        # Pass 1: Define the segments and their attributes, but
        # defer the entrance criteria details to the 2nd pass.
        LOAD_SEGMENT text {
                FLAGS = READ EXECUTE;
        };
        LOAD_SEGMENT data {
                FLAGS = READ WRITE EXECUTE;
        };
        LOAD_SEGMENT bss {
                DISABLE;
                FLAGS=DATA;
        };
        $if amd64
                LOAD_SEGMENT lrodata {
                        FLAGS = READ
                };
                LOAD_SEGMENT ldata {
                        FLAGS = READ WRITE;
                };
        $endif
        NOTE_SEGMENT note;
        NULL_SEGMENT extra;

        # Pass 2: Define ASSIGN_SECTION attributes for the segments defined
           # above, in the order the link-editor should evaluate them.

        # All SHT_NOTE sections go to the note segment
        NOTE_SEGMENT note {
                ASSIGN_SECTION {
                        TYPE = NOTE;
                };
        };
        $if amd64
                # Medium/large model x86-64 readonly sections to lrodata
                LOAD_SEGMENT lrodata {
                        ASSIGN_SECTION {
                                FLAGS = ALLOC AMD64_LARGE;
                        };
                };
        $endif

        # text receives all readonly allocable sections
        LOAD_SEGMENT text {
                ASSIGN_SECTION {
                        FLAGS = ALLOC !WRITE;
                };
        };

        # If bss is enabled, it takes the writable NOBITS sections
        # that would otherwise end up in ldata or data.
        LOAD_SEGMENT bss {
                DISABLE;
                ASSIGN_SECTION {
                        FLAGS = ALLOC WRITE;
                        TYPE = NOBITS;
                };
        };

        $if amd64
                # Medium/large model x86-64 writable sections to ldata
                LOAD_SEGMENT ldata {
                        ASSIGN_SECTION {
                                FLAGS = ALLOC WRITE AMD64_LARGE;
                        };
                        ASSIGN_SECTION {
                                TYPE = NOBITS;
                                FLAGS = AMD64_LARGE
                        };
                };
        $endif

        # Any writable allocable sections not taken above go to data
        LOAD_SEGMENT data {
                ASSIGN_SECTION {
                        FLAGS = ALLOC WRITE;
                };
        };

        # Any section that makes it to this point ends up at the
        # end of the object file in the extra segment. This accounts
        # for the bulk of non-allocable sections.
        NULL_SEGMENT extra {
                ASSIGN_SECTION;
        };