了解和规划 toc
该 TOC 用于在 XCOFF 文件中查找对象。
XCOFF 文件的目录 (TOC) 与工作簿的目录类似。 该 TOC 用于在 XCOFF 文件中查找对象。 XCOFF 文件由包含不同类型的数据的部分组成,这些数据将用于特定用途。 某些部分可以进一步细分为子部分或 科茨。 Csect 是 XCOFF 文件的最小可更换单元。 在运行时, TOC 可以包含 csect 位置 (以及 csect 内的标签位置)。
包含 csect 的三个部分是:
| 项 | 描述 |
|---|---|
| .text | 指示此 csect 包含代码或只读数据。 |
| . 数据 | 指示此 csect 包含读写数据。 |
| .bss | 指示此 csect 包含未初始化的映射数据。 |
csect 的存储类确定将 csect 分组到其中的部分。
TOC 位于 XCOFF 对象文件的 . 数据 部分中,且由 TOC 条目组成。 每个 TOC 条目都是存储映射类为 TC 或 TD 的 csect。
具有 TD 存储映射类的 TOC 条目包含标量数据,可以从 TOC 直接访问这些数据。 这允许直接从 TOC 访问一些经常使用的全局符号,而不是通过 TOC 中包含的地址指针 csect 间接访问。 要访问 TOC 中的标量数据,需要两个部分的信息:
- TOC 的开始位置 (即 TOC 锚点)。
- 从 TOC 锚点到包含数据的特定 TOC 条目的偏移量。
具有 TC 存储映射类的 TOC 条目包含其他 csect 或全局符号的地址。 每个条目可以包含 csect 或全局符号的一个或多个地址,但建议在每个 TOC 条目中仅放置一个地址。
组装程序时,将对 csect 进行排序,以便先编写 .text csect ,然后再编写除 TOC 之外的所有 . 数据 csect。 TOC 写在所有其他 . 数据 csect 之后。 TOC 条目被重定位,以便具有 TC 存储映射类的 TOC 条目在排序后包含 csect 地址,而不是在源程序中包含 csect 地址。
在装入 XCOFF 模块时,将再次重定位具有 TC 存储映射类的 TOC 条目,以便使用 csect 将驻留在内存中的真实地址来填充 TOC 条目。 要访问模块中的 csect ,需要以下两条信息:
- TOC 的开头的位置。
- 从 TOC 的开头到指向 csect 的特定 TOC 条目的偏移量。 如果 TOC 条目具有多个地址,那么可以通过向偏移量添加 (0 ... (n-1)) * 4 来计算每个地址,其中 n 是使用 .tc 伪操作定义的 csect 地址的位置。