Linux on POWER 中的 GNU C/C 工具链(5)
2008-02-23 05:41:12来源:互联网 阅读 ()
向量通常需要采用新颖的方法才能形成一个好的算法,只有程式员仔细规划代码才能够实现这种功能。实际上,编写得不好的向量代码的运行速度通常比普通的代码都慢,因为他进行对齐的效率很低。VMX 寄存器中处理的数据必须按照 4 个字进行对齐(128 位),程式员要负责确保这些指令所处理的数据缓冲区都是对适当的地址进行对齐的。这需要特别注意通过在 32 位模式中动态内存分配所创建的缓冲区,因为他们只能确保是按照双字进行对齐的。然而,在 64 位模式中,malloc 子系统返回的是按照 4 个字进行对齐的地址。
在线教程“Introduction to Altivec - Ten Easy Ways to Vectorize Your Code”(PDF)对代码的向量化详尽地进行了介绍。 (请参阅 参考资料。)这篇文章讨论了向量化编码对循环展开和像素操作等所带来的巨大好处。
在 GCC 中,VMX 的功能是使用 -maltivec 和 -mabi=altivec 标记来启用的。
值得注意的是,Apple 的 Mac OS X 操作系统上的 GCC 也支持了他们自己的 AltiVec 扩展的实现,但是稍有区别。区别之一是向量声明的语法,这会影响代码在这些平台之间的迁移。在 GCC for Linux on POWER 中,向量位于花括号 { } 中,而在 GCC for OS X 中,向量则是位于圆括号 ( ) 中。IBM XL C/C 能够同时支持这两种方法。有关这个问题连同 VMX 实现之间的差异的更多信息,请参阅 “About Compilers with VMX Support” 的 Web 主页。(请参阅 参考资料。)
表 3. 向量的语法
VMX 向量语法 GCC for Linux IBM XLC C/C GCC for Mac OS X花括号 {...} 支持 支持 不支持
圆括号 (...) 不支持 支持 支持
对齐选项
GNU toolchain for Linux on POWER 能够使用数据对齐选项来调整基于 POWER 和 PowerPC 实现(例如,嵌入式处理器)的数据宽度范围,连同和其他架构之间的互操作能力。尽管默认的对齐模式是针对 64 位的 POWER 架构进行优化的,但是实际上还能够使用一种自然的对齐选项。自然对齐方式放弃了平台上根据 long double 类型进行对齐的长处,因此是最有效的一种内存对齐方式。但是,为了确保和其他平台上编译的对象之间的互操作能力,可能会需要使用自然对齐方式。-malign-power 标记为 POWER 架构指定优化的对齐方式,这对于 GCC 来说是默认的。–malign-natural 标记用来指定自然对齐方式。
TOC 选项
POWER 处理器在执行模式中利用了一个称为 Table of Contents(简称 TOC)的概念。TOC 是每个模块的一个定位点,用作查找该模块中全局数据、静态数据连同和位置无关的代码的一个引用点。每个模块(例如,主程式或共享库)都包含有自己的 TOC。这个系统特有的属性是由 64 位的 PowerPC ELF ABI 定义的,能够使用 r2 寄存器进行访问。在构造 TOC 项时,GCC 驱动器能够接受一些选项来控制链接器的行为。这些选项会在后文中的 “GNU 链接器” 一节中进行介绍。
GNU Binutils
GNU binutils 包括一套用来构造和使用二进制文档所需要的工具。其中两个最为关键的 binutils 是 GNU 链接器 ld 和 GNU 汇编程式 as。这两个工具是 GNU 工具链中的两个完整部分,通常是由 GCC 前端进行驱动的。然而,了解如何直接引导 GNU 工具链的这些组件将很有用。本节将介绍如何控制这两个工具并选择其他 binutils 以便易于移植,并介绍 POWER 架构特有的一些功能,连同常见的一些问题和误解。
GNU 链接器
链接是创建一个可执行程式的最后一个步骤。GNU 链接器可执行程式,或称为链接编辑器,是 ld,他的角色是将对象文档合并成可执行程式,同时指定程式在运行时是如何执行的。GNU 链接器使用一个命令语言脚本来控制链接过程;默认情况下,ld 是由一组内部命令进行控制的,这些命令能够进行扩展或覆盖。强调可移植性和灵活性在 GCC 的功能中是很明显的一条,他能够为很多不同的编译环境生成链接脚本,并向 ld 传递定制过的链接脚本,而不用手工进行干预。相反,在其他某些系统中,链接编辑器则很难实现这一点。例如,AIX 的链接器就需要自己处理定制过程,而不是在一个预链接的编译步骤中来完成。
本节将介绍 GCC 驱动器和链接器之间的交互,提供 64 位 PowerPC ELF ABI 的一些周详信息,并探索 Linux on POWER 上链接器实现的一些异常之处。
由于链接器的角色是将对象代码集合在一起,并产生一个可执行模块,因此编译器驱动器会将所期望的参数传递给 ld。这包括:应用程式对象文档,启动代码(在进程启动且调用 main() 之前所运行的代码),可能有用的包和所依赖的共享模块清单,库搜索路径(在链接时和调用时使用),已平台所需要的实现特有的选项。ld 会从左到右遍历命令行,并使用这个顺序来确定如何查找/引用哪些符号。
Linux on POWER 对象文档
Linux on POWER 使用 ELF 对象文档格式。这种灵活且可扩展的格式能够很好地满足平台的需要,另外更有几个特别的段。表 4 列出了这些特别的段,并对其进行了介绍:
表 4. 特别的段
段 描述.glink 包含对全局链接代码的支持。模块间的函数调用(例如主程式和 libc.so)需要加载一个函数描述符,其中这个描述符波包含了目标程式的地址和目标模块的 TOC 值。(周详信息请参看下面的 TOC。)这种机制是由过程链接表(.plt)段和 .glink 段实现的。
.toc 这是 TOC 的一部分,每个模块都有这样一个段,他是加载全局信息使用的一个字典。作为 TOC 的一部分,.toc 段包含了初始化信息。
.tocbss 其作用类似于一个 .bss 段,但是为 TOC 保存了一个尚未初始化的数据区。
.got 全局偏移量表(Global Offset Table)保存在 .got 段中,由此能够访问全局数据项(在本模块之外也是可见的)。注意,尽管数据能够加载到 .toc 或 .tocbss 段中,但是全局数据通常都是通过 GOT 进行寻址的。
.plt 包含了对模块间调用的支持。每个模块(主程式,共享对象)都包含了自己的 TOC,因此也都有自己的 TOC 定位点。这个段的内容是由动态链接器进行填充的,他支持一个用来支持惰性符号解析的简单函数描述符集合(特例)。
以下节选自“64-bit PowerPC ELF ABI Supplement”(请参阅 参考资料):
ELF 处理器特有的实现通常会定义一个 GOT (‘Global Offset Table’)段用来保存位置无关的代码。有些 ELF 处理器特有的实现,包括 32 位的 PowerPC Processor Supplement,定义了一个小的数据段。有时会使用相同的寄存器来对 GOT 和这个小的数据段进行寻址。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: GCC 4.0 的新特性
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
