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

文档信息

前言

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

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

5.  接口和版本控制

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

第 2 部分快速参考

7.  链接编辑器快速参考

8.  版本控制快速参考

第 3 部分高级主题

9.  直接绑定

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

11.  可扩展性机制

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

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

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

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

索引

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

下面说明链接编辑器用来将节指定给输出段的内部过程。这些信息并不是使用 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;
        };