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

退出打印视图

更新时间: 2014 年 7 月
 
 

SEGMENT_ORDER 指令

SEGMENT_ORDER 指令用于为输出目标文件中的段指定非缺省顺序。

SEGMENT_ORDER 接受段名称的空格分隔列表。

        SEGMENT_ORDER  = segment_name....;
        SEGMENT_ORDER += segment_name....;

使用 "=" 形式的赋值时,将放弃之前的段顺序列表并替换为新列表。"+=" 形式的赋值将新列表串联到现有列表的最后。

缺省情况下,链接编辑器按以下方式确定段顺序。

  1. 具有通过 LOAD_SEGMENT 指令的 VADDR 属性设置的显式地址的可装入段,按地址排序。

  2. 使用 SEGMENT_ORDER 指令排序的段,按指定顺序排序。

  3. 没有显式地址且未在 SEGMENT_ORDER 列表中列出的可装入段。

  4. 没有显式地址且未在 SEGMENT_ORDER 列表中列出的注释段。

  5. 没有显式地址且未在 SEGMENT_ORDER 列表中列出的空段。


注 - ELF 具有一些格式正确的目标文件所必须遵循的隐式约定。
  • 第一个可装入段应该是只读、可分配和可执行的,并接收 ELF 头和程序头数组。这通常是预定义的文本段。

  • 可执行文件中的最后一个可装入段应该是可写的,并且动态堆的开头通常紧随其后放置在相同的虚拟内存映射中。

可以使用 mapfile 创建不遵循这些要求的目标文件。但应避免如此操作,因为运行这种目标文件的结果是不确定的。


除非指定 HDR_NOALLOC 指令,否则链接编辑器将强制要求第一个段必须是可装入段,而不是注释段或空段。HDR_NOALLOC 不能用于用户级目标文件,因此没什么实用价值。生成操作系统内核时会使用该功能。