Oracle Solaris Studio 12.2:C 用户指南

第 1 章 C 编译器介绍

本章提供有关 Oracle Solaris Studio C 编译器的基本信息。

1.1 5.11 版 Solaris Studio 12 Update 2 发行版的新增功能

请注意当前的 C 编译器发行版中以下新增和更改的功能。

ABI 更改要求重新编译:对 C 编译器的更改将纠正以 64 位模式在 SPARC 处理器上传递和返回包含复杂类型的结构的方式。以前,这些结构值有时会传递和返回到错误的寄存器中,并且创建与 gcc 所创建的二进制文件不兼容的二进制文件。因为此更改在 C 编译器中实现时将影响现有 ABI 的元素,所以如果应用程序中的任何源文件使用具有复杂字段的结构时,必须重新编译应用程序的整个源代码库才能避免出现错误应答的可能性。但 32 位 SPARC 处理器和 32/64 位 x86 处理器的编译不受此更改的影响。

1.2 x86 特殊注意事项

针对 x86 Solaris 平台进行编译时,有一些重要问题值得注意。

-xarch 设置为 ssesse2sse2asse3 或更高级别的情况下编译的程序必须在提供这些扩展和功能的平台上运行。

从 Solaris 9 4/04 开始的 Solaris OS 发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。如果所运行的 Solaris OS 不支持由 -xarch 选定的指令集,则编译器无法为该指令集生成链接代码。

如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。

在 x86 上得到的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。

因为内部数学库(例如,sin(x))不同,所以 Solaris 和 Linux 之间的数值结果也会不同。

1.3 二进制兼容验证

在 Solaris 系统上,从 Solaris Studio 11 开始,Solaris Studio 编译器编译的程序二进制文件都标记了体系结构硬件标志(表示由编译的二进制文件采用的指令集)。运行时,会检查这些标记标志以验证该二进制文件是否可以在它尝试在上面执行的硬件上运行。

如果在没有相应功能或指令集扩展的平台上运行不包含这些体系结构硬件标志的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。

此警告还会扩展到采用 .il 内联汇编语言函数或 __asm() 汇编程序代码(使用 SSE、SSE2、SSE2a 和 SSE3 以及更新指令和扩展)的程序。

1.4 针对 64 位平台进行编译

使用 -m32 选项针对 ILP32 32 位模型进行编译。使用 -m64 选项针对 LP64 64 位模型进行编译。

ILP32 模型指定 C 语言 int、long 和 pointer 数据类型均为 32 位。LP64 模型指定 long 和 pointer 数据类型均为 64 位。Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。

如果使用 —m64 进行编译,则生成的可执行文件仅能在运行 64 位内核的 Solaris OS 或 Linux OS 下的 64 位 UltraSPARC 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Solaris 或 Linux OS 上进行。

1.5 标准一致性

本书中所用术语 C99 是指 ISO/IEC 9899:1999 C 编程语言。术语 C90 是指 ISO/IEC 9899:1990 C 编程语言。

当您指定 -xc99=all,lib -Xc 时,此编译器在 Solaris 平台上完全遵循 C99 标准。

此编译器还遵循 ISO/IEC 9899:1990(编程语言-C 标准)。

由于此编译器还支持传统的 K&R C(Kernighan 和 Ritchie,即 ANSI 之前的 C),因此便于迁移到 ISO C。

有关 C90 实现特定行为的信息,请参见D.1.17 _Pragma

有关 C99 特性的更多信息,请参见表 C–6

1.6 C 自述文件

C 编译器的自述文件强调了关于编译器的重要信息。它现在属于《Oracle Solaris Studio 12.2 的新增功能》指南的一部分,其中包括:

转到 http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation 上的 Oracle Solaris Studio 12.2 文档页面,便可以看到该新增功能指南。

1.7 手册页

联机手册 (man) 页提供了有关命令、函数、子例程的当前文档或此类内容的集合。

您可以通过运行以下命令来显示 C 编译器的手册页:


example% man cc

在整个 C 文档中,手册页参考以主题名称和手册节编号显示: cc(1) 通过 man cc 进行访问。例如,可在 man 命令中使用 -s 选项来访问 ieee_flags(3M) 指示的其他部分:


example% man -s 3M ieee_flags

1.8 编译器的组织结构

C 编译系统由一个编译器、一个汇编程序和一个链接编辑器组成。cc 命令会自动调用这些组件中的每个组件,除非您使用命令行选项另行指定。

表 A–15 介绍了 cc 的所有可用选项。

下图显示 C 编译系统的组织结构。

图 1–1 C 编译系统的组织结构

显示 C 编译系统组件的图。

下表汇总了编译系统的组件。

表 1–1 C 编译系统的组件

组件  

说明  

使用说明  

cpp

预处理程序 

仅适用于 -Xs

acomp

编译器(用于非 Xs 模式的内置预处理程序)

 

ssbd

静态同步错误检测 

(SPARC)

iropt

代码优化器 

-O-xO2-xO3-xO4-xO5-fast

fbe

汇编程序 

 

cg

代码生成器、内联函数、汇编程序 

ipo

过程间优化器 

postopt

后优化器 

(SPARC)

ir2hf

中间代码翻译者 

(x86) 

ube

代码生成器 

(x86) 

ld

链接程序 

 

mcs

处理注释部分 

-mr

1.9 与 C 相关的编程工具

有多种工具可用来帮助您开发、维护和改进 C 程序。本书中介绍了两个与 C 联系最紧密的工具:cscopelint。此外,每个工具均有手册页。