ZHCADC4A September 2011 – March 2014
在编译器或汇编器输出的可重定位目标文件中,使用默认规则和编译器指令将变量分配到各个段中。段是可重定位文件中不可分割的分配单元。段通常包含具有类似属性的对象。为数据指定了各种段,具体取决于该段是否已初始化、是可写还是只读的、如何寻址,以及包含的数据类型。
ABI 将静态数据段指定为 near 或 far。可使用高效的 near DP 相对寻址来寻址 near 段,但其大小和位置受到限制。有关静态变量在段中的位置以及如何寻址这些变量的约定,请参阅 节 4.2.2。
链接器将来自目标文件的段组合起来,形成 ELF 加载模块(可执行文件或共享库)中的区段。区段是分配给加载模块的连续存储器范围,表示程序执行映像的一部分。
加载模块可包含一个或多个数据区段,链接器在其中分配栈、堆和静态变量。项可分组为单个区段或多个区段,仅受以下限制:
如果使用 DP 相对寻址来访问区段,则将该区段指定为 DP 相对。单个 DP 相对区段可包含 near 寻址和 far 寻址混合形式,只要满足上文所列限制即可。
运行时环境可动态分配或调整未初始化的数据区段,以便为栈和堆等项分配空间。
图 4-1 展示了 ABI 定义的数据段,以及段到区段的抽象映射。该映射仅是代表性的;具体配置可能因平台或系统而异。初始化段为蓝色阴影;未初始化段为灰色阴影。
.const 和 .fardata:.const 段包含只读常量。.const 段包含与位置无关的常量。根据平台的不同,.const 段可位于只读存储器中,并且可使用绝对寻址来寻址,或者在位置无关模型中通过 PC 相对寻址相对于代码来寻址。在一些共享只读段的平台(例如 Linux)上,无法共享初始化值包含地址常量的 const 对象。因此,将其置于名为 .fardata:.const 的不同段中,这样命名是因为可视其为数据区段中 .fardata 的一部分。
.rodata 段包含可通过 near DP 相对寻址来寻址的只读常量。
.neardata 和 .fardata 段包含初始化的读写变量。这些段对应于其他架构中常见的 .data 段。
.bss 和 .far 段包含未初始化变量。
.common 和 .scommon 段包含链接器分配的通用块符号。这些并不是目标文件中的实际段。相反,段名称是链接器命令文件中用于放置变量的约定。这些段不应用于其他目的。
.got 和 .dsbt 段包含与动态链接相关的数据结构。请参阅Chapter6。
节 13.3.5 中列出了可由链接器命令文件放置的其他特殊段。