生成环境包括系统头文件、编译系统和库,这些内容将在以下各节中进行介绍。
一组系统头文件可同时支持 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 |
类型 |
_LP64 |
类型 |
符号 _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 用户指南》。
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 位环境均可用。编译器和其他各种工具(例如 ld、ar 和 as)是能够在 32 位或 64 位系统中生成 64 位程序的 32 位程序。当然,在运行 32 位操作系统的系统中生成的 64 位程序不能在该 32 位环境中执行。