Oracle® Solaris Studio 12.4:Fortran 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

3.4.116 -xcode[=v]

(SPARC) 指定 代码地址空间。


注 -  应通过指定 -xcode=pic13-xcode=pic32 生成共享对象。尽管您可以通过 -m64 -xcode=abs64 生成可工作的共享对象,但它们的效率将会很低。使用 -m64 -xcode=abs32-m64 -xcode=abs44 生成的共享对象将不起作用。

下表列出了 v 的值。

表 3-18  -xcode 标志
含义
abs32
这是 32 位体系结构的缺省值。生成 32 位绝对地址。代码 + 数据 + BSS 的大小不超过 2**32 字节。
abs44
这是 64 位体系结构的缺省值。生成 44 位绝对地址。代码 + 数据 + BSS 的大小不超过 2**44 字节。只适用于 64 位体系结构。
abs64
生成 64 位绝对地址。只适用于 64 位架构。
pic13
生成共享库(小模型)中使用的与位置无关的代码。与 -Kpic 等效。允许在 32 位体系结构中最多引用 2**11 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**10 个。
pic32
生成共享库(大模型)中使用的与位置无关的代码。与 -KPIC 等效。允许在 32 位体系结构中最多引用 2**30 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**29 个。

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

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

  • –xcode=pic13–xcode=pic32 编译的例程会在入口点执行一些附加指令,以将寄存器设置为指向用于访问共享库的全局变量或静态变量的表 (_GLOBAL_OFFSET_TABLE_)。

  • 对全局或静态变量的每次访问都会涉及通过 _GLOBAL_OFFSET_TABLE_ 的额外间接内存引用。如果编译包括 -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,请使用 elfdump -c 检查全局偏移表 (Global Offset Table, GOT) 的大小并查找节头 sh_name: .got sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13。否则,请指定 -xcode=pic32。有关更多信息,请参见 elfdump(1) 手册页。

按照以下准则来确定应如何使用 -xcode

  • 如果要生成可执行文件,请勿使用 -xcode=pic13-xcode=pic32

  • 如果要生成仅用于链接到可执行文件的归档库,请勿使用 -xcode=pic13-xcode=pic32

  • 如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,再使用 -xcode=pic32

  • 如果要生成用于链接到共享库的归档库,请使用 -xcode=pic32