SPARC V9。编译器针对不同目的提供了不同的代码模型,旨在提高性能并减少 64 位 SPARC 程序中代码的大小。代码模型由以下因素确定:
可放置性(绝对独立代码与位置无关代码)
代码大小(< 2 GB)
位置(地址空间中的低、中或任意位置)
外部对象引用模型(小或大)
下表介绍了可用于 64 位 SPARC 程序中的不同代码模型。
表 6–1 代码模型说明:SPARC V9
代码模型 |
可放置性 |
代码大小 |
位置 |
外部对象引用模型 |
---|---|---|---|---|
abs32 |
绝对 |
< 2 GB |
低(低 32 位地址空间) |
无 |
abs44 |
绝对 |
< 2 GB |
中(低 44 位地址空间) |
无 |
abs64 |
绝对 |
< 2 GB |
任意位置 |
无 |
pic |
PIC(位置无关代码) |
< 2 GB |
任意位置 |
小(<= 1024 个外部对象) |
PIC |
PIC |
< 2 GB |
任意位置 |
大(<= 2**29 个外部对象) |
在某些情况下,可以使用较小的代码模型实现较短的指令序列。 在绝对代码中执行静态数据引用所需的指令数在不同的代码模型中各不相同:在 abs32 代码模型中最少,在 abs64 代码模型中最多,在 abs44 代码模型中居于两者之间。 同样,在执行静态数据引用时,pic 代码模型使用的指令比 PIC 代码模型使用的要少。 因此,代码模型越小,代码块越小,对于无需利用较大代码模型的更完整功能的程序,还可能会提高其性能。
要指定要使用的代码模型,应使用 -xcode=<model> 编译器选项。目前,对于 64 位对象,编译器在缺省情况下使用 abs64 模型。 通过使用 abs44 代码模型可以优化代码,此时将使用较少的指令,并且仍能涵盖当前的 UltraSPARC 平台所支持的 44 位地址空间。
有关代码模型的更多信息,请参见 SPARC V9 ABI 和编译器文档。
对于使用 abs32 代码模型编译的程序,必须使用 -M /usr/lib/ld/sparcv9/map.below4G 选项将其链接到 4 GB 以下的地址空间。