Linux on POWER 中的 GNU C/C 工具链

2008-02-23 05:41:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在本文中,您将学习有关 Linux™ on POWER™ 中 GNU 工具链的知识。本文将重点介绍可用于使用 Linux on POWER 上的 GNU 编译器(compiler)、链接器(linker)和加载器(loader)的一些常用选项,还将讨论 GNU binutils,重点考虑特定于 Linux on POWER 的一些考虑事项,连同 SUSE Linux Enterprise Server Version 9 和 Red Hat Enterprise Linux Version 4 中提供的一些新特性。

简介
GNU 软件的一个显著长处是他来自严格的研发者社区,具备很好的可移植性。GNU 研发工具链(toolchain)是指 GNU Compiler Collection、GNU libc 连同用来编译、测试和分析软件的 GNU binutils。这些工具遵守 PowerOpen ABI 和 64 位的 PowerPC® ELF ABI Supplement 规范,从而确保和其他类似工具的二进制兼容性。此外,他们是 Linux on POWER 的默认研发工具链。

尽管 GNU 工具重点强调的是兼容性,但是和其他通用研发平台相比,他们在 POWER 架构上仍然有一些特有的区别。POWER 上的指令集和其他架构有所不同,GNU toolchain 负责处理这些区别。研发人员应该理解使用 GNU toolchain for Linux on POWER 的细节。例如,在 Linux on POWER ABI 和其他通用的 ABI 之间有所差异,研发人员必须知道在研发和移植软件时,这些差异会对自己的代码产生什么影响。

值得一提的是 IBM XL C/C 和 Fortran 编译器也会使用 GNU toolchain 来生成二进制文档。在这些相关的地方,我们将针对 XL C/C 对 GNU toolchain 进行讨。通过逐步解决基本操作、特定于 POWER 的操作、潜在的缺陷和 GNU toolchain 一些新研发的特性,本文解决了 GNU toolchain for Linux on POWER 的软件研发和可移植性需求问题。本文还对 GCC C/C 编译器、GNU 链接器和汇编程式连同其他一些 GNU binutils 进行了探索。虽然更有很多平台都没有介绍,但 GNU 手册通常都会引用一些完整介绍这些主题的资料。本文并没有讨论 Linux on POWER 系统中其他 GCC 编译器、IBM XL C/C 、Fortran 或 Java 研发的一些细节问题。

我们从 GCC 编译器和编译驱动器入手开始介绍,依次介绍 GNU 链接器、GNU 汇编程式和其他的 binutils。本文没有明确地对 GNU C Library 进行讨论,因为特定于 POWER 的变体很少,应该不会影响到用户,C Library 通常也被认为是 GNU Toolchain 的一部分。在合适的地方,我们给出了在 Linux on POWER 上发现的一些细微区别,为那些熟悉其他平台上的 Linux 或在 POWER 架构上运行的 AIX 的研发人员提供帮助。(例如,x86 和 POWER 之间就有一些区别:前者的汇编程式不同,后者在 ELF 和 XCOFF ABI 之间也有所不同。)

GNU Compiler Collection
从历史传统上来说,GCC 是代表 GNU C Compiler,但是现在他代表 GNU Compiler Collection。GCC 是用于 C、C 、Objective-C、Java™、Fortran 和 Ada 编程语言的一个编译器集。但是本文的讨论仅仅局限于 C 和 C 编译器,尤其是那些 GCC 的操作和选项、特定于 POWER 架构的 GCC 特性操作和受 GCC 支持的最新特性,这些特性是随 Linux for POWER 架构的两个领先发行版本(Red Hat Enterprise Server AS 和 SUSE LINUX Enterprise Server)一起打包的。

GCC 的基本操作
GCC 的基本操作驱动着预处理、编译、汇编和链接的过程。传递给 GCC 的大部分选项实际上都会被重定向给工具链中的其他组件。有些选项,例如平台的选择、调试和优化标记,会为编译器和其他组件同时提供参数。

输入选项
编译器必须知道要处理的是哪种类型的输入数据。例如,C 源程式文档的处理就和 C 文档不同。对于编译器来说,有一个基本的隐式选项:源程式文档的扩展名。该选项将决定调用哪一个 GCC 编译器。例如,file.c 调用的是 C 编译器,而 foo.C 或 foo.cxx 则会调用 C 编译器。在 GCC 手册中列出了可接收源代码文档的扩展名的完整列表。

下图展示了 GNU Toolchain 生成可执行程式或共享对象所应采取的步骤。GCC 驱动器通过接受一些选项对整个 toolchain 间接进行控制。

图 1. 生成可执行程式或共享对象的步骤
生成可执行程式或共享对象的步骤

输出选项
编译器还必须知道用户期望获得哪种类型的输出。GCC 驱动器能够为整个工具链的其他部分产生一些指令,从而生成最终的可执行程式,或在生成一些中间文档时就停止。您能够使用源程式的文档扩展名或命令行选项来控制编译器的输出。

表 1 对输出文档的选项进行了总结。

表 1. 输出文档的选项
标记 操作 输出格式-c 汇编,但不链接 .o 文档
-S 编译,但不汇编 .s 文档
-E 预处理,但不编译 对 .c 文档进行预处理后的结果

例如,下面的命令能够对源文档 hello.c 进行预处理和编译,生成 hello.s 文档:


$ gcc -S hello.c

所生成的文档 hello.s 就已能够进行汇编生成对象文档了。

另外一组输出现象影响的是编译器的输出信息,而不是输出文档的格式。-v 选项会显示编译过程的周详信息,-### 选项的作用是显示这些周详信息,但是并不执行这些命令。后面这个选项在创建编译脚本时尤其有用。

Dialect 和标准选项
正如前面介绍的相同,GCC 能够为很多种语言编译二进制文档。这些语言都有一些特定变体,即方言,这些变体被概括为特别的语言约定。GCC 能够接受一些选项来指定编译器所使用的方言。这包括标准选项,连同对标准限定进行修改的更具体的标记。GCC 支持 1990 年发布的 ANSI C Standard,并支持 1995 年所添加的扩展,连同部分支持 C99 修正标准。

-ansi 和 -std 标记能够用来对编译器强制施加一些限制。-ansi 标记会禁用 GNU 的扩展(请参看下面的 表 2),例如 inline 和 asm。注意其他的 GNU 关键字,例如 __inline__ 和 __asm__ 依然能够继续使用,但是这会破坏对语言标准规范的遵守。-ansi 选项还会禁止在 C 语言中使用 C 风格的注释。

-std= 选项能够指定标准等级或 GNU 对该标准的扩展等级。这些选项在下表中进行了总结。能够在 GCC 手册的 3.4 节中看到任何可用规范的完整列表。(请参阅 参考资料。)

表 2. 标准和标准扩展选项
-std= 标记 标准或标准扩展c89 或 iso9899:1990 ISO C90(和 -ansi 相同)
iso9899:199409 ISO C90,1994 amendment

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 周详解析C 编写的ATM自动取款机模拟程式

下一篇: GCC 4.0 的新特性