Oracle Solaris Studio 12.2:C++ 用户指南

A.2.118 –xcode=a

SPARC:指定代码地址空间。


注 –

应通过指定 -xcode=pic13-xcode=pic32 生成共享对象。未使用 pic13pic32 生成的共享对象不能正常工作,也可能根本无法生成。


A.2.118.1 值

a 必须是下列值之一。

表 A–29 -xcode

值 

含义  

abs32

生成快速但有范围限制的 32 位绝对地址。代码 + 数据 + bss 的大小被限制为 2**32 字节。 

abs44

SPARC:生成具有适当速度和范围的 44 位绝对地址。代码+数据+bss 的大小不应超过 2**44 字节。只适用于 64 位架构。请勿将该值与动态(共享)库一起使用。 

abs64

SPARC:生成缓慢但无范围限制的 64 位绝对地址。只适用于 64 位架构。 

pic13

生成快速但有范围限制的位置无关代码(小模型)。等效于 – Kpic。允许在 32 位架构上最多引用 2**11 个唯一的外部符号,而在 64 位架构上可以最多引用 2**10 个。

pic32

生成与位置无关的代码(大模型),这可能没有 pic13 快,但有完整范围。等效于 – KPIC。允许在 32 位体系结构上最多引用 2**30 个唯一的外部符号,而在 64 位体系结构上最多可以引用 2**29 个。

要确定是使用 –xcode=pic13 还是使用 –xcode=pic32,应使用 elfdump -c(有关更多信息,请参见 elfdump(1) 手册页)检查全局偏移表 (Global Offset Table, GOT) 的大小以及 sh_name: .gotsh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13,否则指定 -xcode=pic32

通常,应根据以下准则来确定如何使用 -xcode

缺省值

对于 32 位体系结构,缺省值是 -xcode=abs32。64 位体系结构的缺省值是 -xcode=abs44

生成共享动态库时,缺省 -xcodeabs44abs32 将与 64 位体系结构一起使用。但指定 -xcode=pic13-xcode=pic32。在 SPARC 上使用 –xcode=pic13–xcode=pic32 时存在两项名义性能开销:

在考虑上述成本时,请记住:由于受到库代码共享的影响,使用 -xcode=pic13-xcode=pic32 会大大减少系统内存需求。共享库中使用 -xcode=pic13– xcode=pic32 编译的每页代码都可以供使用该库的每个进程共享。如果共享库中的代码页包含非 pic(即绝对)内存引用,即使仅包含单个非 pic 内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本。

确定是否已经使用 -xcode=pic13–xcode=pic32 编译了 .o 文件的最简单方法是使用 nm 命令:


% nm file.o | grep _GLOBAL_OFFSET_TABLE_ U _GLOBAL_OFFSET_TABLE_

包含与位置无关的代码的 .o 文件将包含对 _GLOBAL_OFFSET_TABLE_ 无法解析的外部引用(用字母 U 标记)。

要确定是使用 –xcode=pic13 还是使用 –xcode=pic32,应使用 nm 确定库中使用或定义的不同全局变量和静态变量的数量。如果 _GLOBAL_OFFSET_TABLE_ 的大小小于 8,192 字节,就可以使用 -Kpic。否则,就必须使用 -xcode=pic32