用于扩大 TOC 访问范围的选项

扩大目录 (TOC) 访问范围是处理 TOC 溢出的有效方法。 可使用两条指令来访问 TOC 并将范围分组到连续 TOC 区域。 IBM PowerPC® 上的最大 16 位偏移量支持 64 K TOC 区域的大型 TOC。 如果每个 TOC 区域中都包含 64000 个条目(最大值),那么大型 TOC 可为 4 GB。 这会产生 10 亿个全局符号(在 32 位环境中)或 5 亿个全局符号(在 64 位环境中)的限制。 在 POWER8 系统或更高版本中,这两个指令通常同时执行。

要放大 TOC ,可以指定 -bbigtoc-qpic=large 选项。 在指定选项之前,请减少 TOC 条目数,因为包含生成的代码的程序可能会导致性能低下。

-bbigtoc

-bbigtoc 选项是 -b 标志的链接程序选项。 如果 TOC 的大小大于 64 K ,那么将生成额外的代码。 为了增加 TOC 总容量,除了基本 TOC 之外,还会创建扩展 TOC 区域。 因此,基本 TOC 是第一个 64 K 区域,其次是构成扩展 TOC 的一个或多个 64 K 区域。 当全局符号的地址放在扩展 TOC 中时,链接程序会将分支插入到行外代码中,该代码包含用于计算扩展 TOC 中的位置的指令。 符号的位置是使用 三个指令计算的: 一个用于查找扩展 TOC 区域,第二个用于计算扩展 TOC 中的位置,第三个用于分支返回。 指定此选项时,将增加执行时间。
注: -bbigtoc 选项是链接程序选项,指定该选项时,不会更改编译器生成的代码。

-qpic=large

-qpic=large 选项与链接程序配合使用,以生成比 -bbigtoc 选项更有效的代码。 指定 -qpic=large 时,编译器始终生成两个指令以获取符号的地址,无论是否发生 TOC 溢出。 指定选项时,所有符号 (包括基本 TOC 中的符号) 都需要额外的指令来计算地址。 对于正常 64 KB 基本 TOC 大小内的偏移量,链接程序会将第一个指令转换为不执行任何操作且不需要执行时间的指令。 在 POWER8或更高版本上,这两个指令通常合并为一个具有较大位移的指令。 链接程序不会将分支插入到偏移量的行外代码中。 有关选项对性能的影响的更多信息,请参阅处理TOC溢出的性能注意事项

注: 不必为每个编译单元指定 -qpic=large