链接程序和库指南

SPARC: -K pic-K PIC 选项

对于 SPARC 二进制文件,-K pic 选项与备用 -K PIC 选项之间的细微差异会影响对全局偏移表项的引用。请参见全局偏移表(特定于处理器)

全局偏移表是一个指针数组,对于 32 位(4 个字节)和 64 位(8 个字节)目标文件其项大小为常量。以下代码序列使用 -K pic 引用项:


        ld    [%l7 + j], %o0    ! load &j into %o0

其中,%l7 是执行引用的目标文件的 _GLOBAL_OFFSET_TABLE_ 符号的预计算值。

此代码序列为全局偏移表项提供了 13 位位移常量。因此,此位移为 32 位目标文件提供了 2048 个唯一项,为 64 位目标文件提供了 1024 个唯一项。如果创建目标文件需要的项数多于可用项数,则链接编辑器会生成以下致命错误:


$ cc -K pic -G -o lobfoo.so.1 a.o b.o ... z.o

ld: fatal: too many symbols require `small' PIC references:

        have 2050, maximum 2048 -- recompile some modules -K PIC.

要克服这种错误情况,请使用 -K PIC 选项编译某些输入可重定位目标文件。此选项为全局偏移表项提供了 32 位常量:


        sethi %hi(j), %g1

        or    %g1, %lo(j), %g1    ! get 32–bit constant GOT offset

        ld    [%l7 + %g1], %o0    ! load &j into %o0

可以使用带有 -G 选项的 elfdump(1) 查看目标文件的全局偏移表要求。还可以使用链接编辑器调试标记 -D got,detail 在链接编辑过程中检查这些项的处理。

理论上,使用 -K pic 模型对经常访问的数据项有益。可以使用这两种模型引用单个项。但是,确定哪些可重定位目标文件应该使用其中一个选项进行编译可能会相当耗时,并且不会显著改善性能。通常,使用 -K PIC 选项可轻松重新编译所有的可重定位目标文件。