ZHCADC4A September 2011 – March 2014
正如 System V ABI 中指定的,动态链接程序在其程序标头中具有 PT_DYNAMIC 类型的条目。该条目指向名为 .dynamic 的特殊段,其段类型为 SHT_DYNAMIC,其中包含与动态链接和加载相关的信息。动态段是指动态符号表段和动态重定位段等其他段,统称为动态信息。
动态信息可包含或不包含在程序的可加载映像内(即,在一个或多个 PT_LOAD 区段内),具体取决于平台特定约定。如果动态信息不可加载,则引用对象组件的动态标签将表示为文件偏移量而不是虚拟地址。
System V ABI 中指定了动态段。表 14-4 中列出了一些 C6000 特定动态标签。
名称 | 容值 | d_un | 可执行 | 共享对象 |
---|---|---|---|---|
DT_C6000_GSYM_OFFSET | 0x6000000D | d_val | 可选 | 可选 |
DT_C6000_GSTR_OFFSET | 0x6000000F | d_val | 可选 | 可选 |
DT_C6000_PRELINKED | 0x60000011 | d_val | 可选 | 可选 |
DT_C6000_DSBT_BASE | 0x70000000 | d_ptr | 强制(如果是 DSBT 模型) | 强制(如果是 DSBT 模型) |
DT_C6000_DSBT_SIZE | 0x70000001 | d_val | 强制(如果是 DSBT 模型) | 强制(如果是 DSBT 模型) |
DT_C6000_PREEMPTMAP | 0x70000002 | d_ptr | 可选 | 可选 |
DT_C6000_DSBT_INDEX | 0x70000003 | d_val | 可选 | 可选 |
全局符号标记标签
动态符号表中的符号指定为局部符号或全局符号。局部符号仅在重定位其包含的模块时才需要;局部符号不涉及动态符号解析,因此动态加载器可在重定位模块后丢弃局部符号。在动态符号表中将局部符号分组在全局符号之前,有助于动态加载器在裸机平台上利用这个机会。DT_C6000_GSYM_OFFSET 标签包含动态符号表 (.dynsym) 中第一个全局符号的偏移量。DT_C6000_GSTR_OFFSET 标签包含动态字符串表 (.dynstr) 中第一个全局符号名称的偏移量。
局部符号仍可出现在标签标记的位置之后,但需保证在标记位置之前没有全局符号。
DT_C6000_PRELINKED
该标签仅用于裸机负载模块,表明文件已具有为其分配的虚拟地址,可能是由预链接器或类似工具分配的。该值表示时间戳。
DT_C6000_PRELINKED 与 Linux 预链接器所用 DT_GNU_PRELINKED 标签类似,但由于裸机预链接并不完全相同,因此定义了不同的标签。
DSBT 标签
这些标签用于使用 DSBT 模型来实现位置无关的加载模块中(请参阅 节 6.7)。DT_C6000_DSBT_BASE 标签标记数据区段的静态链接位置;它对应于 _ _c6xabi_DSBT_BASE 符号。由于加载模块无需包含符号表,因此在该标签中复制值。
DT_C6000_DSBT_SIZE 标签指定保留用于 DSBT 表的大小。所有加载模块的表大小必须至少与其中编号最大的 DSBT 索引一样大。如果所加载模块的表太小或索引太大,则加载程序无法加载该模块。
如 节 6.7 中所述,模块的 DSBT 索引可由链接器静态分配,也可由加载器动态分配。如果加载模块具有静态分配的索引,则 DT_C6000_DSBT_INDEX 标签指定该索引的值。同一进程中的其他动态链接模块都不能使用相同的索引。具有动态可分配索引的模块省略该标签。
DT_PREEMPTMAP
该标签包含依赖静态绑定来预计算符号占先的平台的占先映射的文件偏移量。
DT_PLTGOT
该标签包含全局偏移量表 (GOT) 的虚拟地址。
动态重定位标签
System V ABI 定义了七个动态标签,用于标识目标文件中动态重定位的位置和类型:
基本规范未明确由 DT_RELA 和 DT_RELASZ 描绘的动态重定位是否包括由 DT_JMPREL 和 DT_PLTRELSZ 描绘的 PLT 特定重定位。C6000 ABI 采用约定:DT_RELA 表包括 DT_JMPREL 表。