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

退出打印视图

更新时间: 2014 年 7 月
 
 

预定义段

链接编辑器提供一组预定义的输出段描述符和入口条件。这些定义可满足多数链接情况的需要,并且符合系统预期的 ELF 布局规则和约定。

text、data 和 extra 段是常用段,其他段可提供更专门的用途,如下所述。

  • text

    text 段定义只读可执行文件的可装入段,后者接受可分配、非可写节。这包括可执行代码、程序所需的只读数据以及链接编辑器生成的供运行时链接程序(如动态符号表)使用的只读数据。

    text 段是进程中的第一个段,因此链接编辑器会为其指定 ELF 头和程序头数组。使用 HDR_NOALLOC mapfile 指令可以防止这种情况。

  • data

    data 段定义可写的可装入段。data 段用于程序所需的可写数据和运行时链接程序使用的可写数据,例如全局偏移表 (Global Offset Table, GOT) 和诸如 SPARC 等要求 PLT 节为可写的体系结构上的过程链接表 (Procedure Linkage Table, PLT)。

  • extra

    extra 段捕获未指定在其他位置并由最后的入口条件记录引向该处的所有节。常见的示例包括完整符号表 (.symtab) 以及为便于调试器操作而生成的各种节。这是一个空段,并且没有对应的程序头表项。

  • note

    note 段捕获所有类型为 SHT_NOTE 的节。链接编辑器会提供一个引用 note 段的 PT_NOTE 程序头项。

  • lrodata / ldata

    x86-64 ABI 定义小型、中型和大型编译模型。ABI 要求中型和大型模型的节设置 SHF_AMD64_LARGE 节标志。缺少 SHF_AMD64_LARGE 的输入节必须放在大小不超过 2 GB 的输出段中。lrodataldata 预定义段仅适用于 x86-64 输出目标文件,用于处理设置了 SHF_AMD64_LARGE 标志的节。lrodata 接收只读节,ldata 接收其他节。

  • bss

    ELF 允许任何段包含 NOBITS 节。链接编辑器将这种节放在其所指定到的段的最后。这可以使用程序头项 p_fileszp_memsz 字段来实现,并且必须遵循以下规则。

            p_memsz >= p_filesz

    如果 p_memsz 大于 p_filesz,则多余的字节为 NOBITS。第一个 p_filesz 字节来自目标文件,其余直至 p_memsz 的任何字节会在使用前由系统归零。

    缺省赋值规则将只读 NOBITS 节指定给 text 段,将可写 NOBITS 节指定给 data 段。链接编辑器将 bss 段定义为可接受可写 NOBITS 节的备选段。该段缺省为禁用,并且必须显式启用才能使用。

    由于可写 NOBITS 节可轻松作为 data 段的一部分进行处理,因此设置单独的 bss 段的好处可能不会立即显现出来。根据约定,进程动态内存堆始于最后一个段的末尾,必须是可写的。这通常是 data 段,但如果启用了 bssbss 将成为最后一个段。在生成动态可执行文件时,启用具有适当对齐方式的 bss 段可用于启用堆的大型页分配。例如,以下示例将启用 bss 段并设置 4MB 对齐。

            LOAD_SEGMENT bss {
                    ALIGN=0x400000;
            };

    注 - 用户应注意,对齐规范可能是特定于计算机的,并且在不同硬件平台上的优势可能并不相同。未来的发行版中可能会出现更灵活的请求最佳底层页面大小的方式。