Solaris(64 位)开发者指南

生成环境

生成环境包括系统头文件、编译系统和库,这些内容将在以下各节中进行介绍。

头文件

一组系统头文件可同时支持 32 位和 64 位编译环境。您无需为 64 位编译环境指定其他头文件路径。

应了解头文件 <sys/isa_defs.h> 中的各种定义,以便更好地了解为支持 64 位环境而对头文件进行的更改。该头文件包含一组已知的 #defines,并会为每个指令集体系结构设置这些指令。如果包含 <sys/types.h>,则会自动包含 <sys/isa_defs.h>

下表中的符号由编译环境定义:

符号 

说明 

__sparc

表示 SPARC 系列处理器体系结构,其中包括 SPARC V7、SPARC V8 和 SPARC V9 体系结构。符号 sparc__sparc 的前身。

__sparcv8

表示 SPARC Architecture Manual 版本 8 中所定义的 32 位 SPARC V8 体系结构。

__sparcv9

表示 SPARC Architecture Manual 版本 9 中所定义的 64 位 SPARC V9 体系结构。

__x86

表示 x86 系列处理器体系结构,其中包括 386、486、Pentium、IA-32、AMD64 和 EM64T 处理器。 

__i386

表示 32 位 i386 体系结构。 

__amd64

表示 64 位 amd64 体系结构。 


注 –

__i386__amd64 互斥。符号 __sparcv8__sparcv9 互斥并且仅当定义符号 __sparc 时才相关。


以下符号是从上面所定义的符号的一些组合派生而来的:

符号 

说明 

_ILP32

类型 intlong 和指针的长度均为 32 位的数据模型。

_LP64

类型 long 和指针的长度均为 64 位的数据模型。


注 –

符号 _ILP32_LP64 互斥。


如果无法编写完全可移植的代码,并且需要特定的 32 位与 64 位代码,请使用 _ILP32_LP64 在代码中设置条件。这会使编译环境独立于计算机,并且最大程度地增强应用程序对所有 64 位平台的可移植性。

编译器环境

为了同时支持 32 位应用程序和 64 位应用程序的创建,Sun Studio C、C++ 和 Fortran 编译环境已进行了增强。Sun Studio 中 10.0 发行版的 C 编译器可提供 64 位编译支持。

本机编译和交叉编译模式均受支持。缺省编译环境仍然可以生成 32 位应用程序。尽管这两种模式均受支持,但是它们仍特定于体系结构。使用 Sun 编译器无法在 x86 计算机上创建 SPARC 对象,也无法在 SPARC 计算机上创建 x86 对象。如果缺少体系结构规范或编译模式,则缺省情况下会定义相应的 __sparcv8__i386 符号,在此过程中还会定义 _ILP32。这会最大程度地提高与现有应用程序和硬件库的互操作性。

从 Sun Studio 8 发行版开始,可使用 cc(1) -xarch=generic64 标志来启用 64 位编译环境。

这会在 ELF64 对象中生成 LP64 代码。ELF64 是支持 64 位处理器和体系结构的 64 位目标文件格式,它与在缺省 32 位模式下进行编译时生成的 ELF32 目标文件相对。

-xarch=generic64 标志用来在 32 位或 64 位系统中生成 64 位代码。使用 32 位编译器可以在 32 位系统中生成 64 位对象;但是,不能在 32 位系统中运行 64 位对象。无需为 64 位库指定库路径。如果使用 -l-L 选项来指定其他库或库路径,并且该路径仅指向 32 位库,则链接程序会检测到这一情况,同时将失败并显示错误。

有关编译器选项的说明,请参见《Sun Studio 10 C 用户指南》。

32 位和 64 位库

Solaris 操作环境为 32 位和 64 位编译环境均提供了共享库。

32 位应用程序必须与 32 位库链接,64 位应用程序必须与 64 位库链接。不能使用 64 位库来创建或执行 32 位应用程序。32 位库仍位于 /usr/lib/usr/ccs/lib 中。64 位库位于相应的 lib 目录的子目录中。由于 32 位库的位置没有变化,因此在早期发行版中生成的 32 位应用程序保持二进制兼容。可移植 makefile 应当使用 64 位符号链接来引用任何库目录。

为了生成 64 位应用程序,需要使用 64 位库。可以在本机或交叉编译模式下生成,因为 64 位库对于 32 位和 64 位环境均可用。编译器和其他各种工具(例如 ldaras)是能够在 32 位或 64 位系统中生成 64 位程序的 32 位程序。当然,在运行 32 位操作系统的系统中生成的 64 位程序不能在该 32 位环境中执行。