Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1284106
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-08 17:39:18

 
 
 
移植到 SOLARIS™ OS:
LINUX 开发者指南
2007 年 1 月
请回收
© 2006-2007 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, CA 95054 USA
保留所有权利。
本文档及其相关产品的使用、复制、分发和反编译均受许可证限制。未经 Sun 及其许可方(如果有)的事先书面许可,不得以任何形式、任何
手段复制本产品或文档的任何部分。第三方软件,包括字体技术,均已从 Sun 供应商处获得版权和使用许可。
本产品的某些部分可能是从 Berkeley BSD 系统衍生出来的,并获得了加利福尼亚大学的许可。
Sun、Sun Microsystems、Sun 徽标、CoolThreads、Java、NetBeans、OpenSolaris、Solaris、StarSuite、Sun Studio 和 Sun Fire 是 Sun Microsystems,
Inc. 在美国和其他国家/ 地区的商标、注册商标或服务标记。
所有 SPARC 商标的使用均已获得许可,它们是 SPARC International Inc. 在美国和其他国家/ 地区的商标或注册商标。标有 SPARC 商标的产品
均基于由 Sun Microsystems, Inc. 开发的体系结构。
AMD Opteron 是 Advanced Micro Devices, Inc. 的商标。
UNIX 和 X/Open 是 X/Open Company, Ltd. 在美国和其他国家/ 地区独家许可的注册商标。
OPEN LOOK 和 Sun™ 图形用户界面是 Sun Microsystems, Inc. 为其用户和许可证持有者开发的。Sun 感谢 Xerox 在研究和开发可视或图形用户界
面的概念方面为计算机行业所做的开拓性贡献。Sun 已从 Xerox 获得了对 Xerox 图形用户界面的非独占性许可证,该许可证还适用于实现
OPEN LOOK GUI 和在其他方面遵守 Sun 书面许可协议的 Sun 许可证持有者。
有限权利:美国政府的使用、复制或公开将受到 FAR 52.227-14(g)(2)(6/87) 和 FAR 52.227-19(6/87) 或 DFAR 252.227-7015(b)(6/95) 和 DFAR
227.7202-3 (a) 的限制。本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均
不承担任何责任,除非此免责声明的适用范围在法律上无效。
目录Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
目录
介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Solaris 10 OS 和 Linux 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Sun 提供的帮助. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
其他资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Linux 与 Solaris 10 OS 的关联 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
迁移问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
处理器体系结构问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
小端字节序与大端字节序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
应用程序数据存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
存储顺序和对齐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
读/ 写结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
32 位和 64 位问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
多线程编程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
软件开发工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
编译器的差异. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
源代码和版本控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
源代码控制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
CVS 与 RCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
应用程序生成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Make 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
iMake 实用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
应用程序打包. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
开发工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Linux 工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Solaris 10 OS 开发环境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Sun Studio 11 编译器和工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
图形应用程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
调试和代码优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
使用 LAMP 栈移植应用程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
内存管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
API 的差异. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
系统调用和库调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Sun 应用程序移植助理 (Sun Application Porting Assistant, Sun APA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Sun APA 演示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
命令行界面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
图形用户界面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
目录Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Sun APA 报告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
问题详细信息报告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
移植过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
结论. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
致谢. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
参考资料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
附录 A:编译器选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
附录 B:链接程序选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
附录 C:兼容的 #pragmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
变量的属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
函数的属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
有用的 Sun Studio 编译器选项(在 gcc 上不可用). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
附录 D:内联汇编 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
附录 E:Make 选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
附录 F:RCS、SCCS 和 CVS 的对应关系. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
附录 G:建议的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
移植评估 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
模块级移植. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
集成测试和功能测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
系统测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
部署. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
1- 介绍Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 1 章
介绍
本文的目的是提供一组指南,帮助读者解决在将基于 Linux 的应用程序迁移到 Solaris™ 10 操作系统期间遇
到的问题。我们还通过支持信息,讨论了两种环境在操作系统功能、体系结构、系统调用和应用程序开发
环境方面的相似之处和不同之处。此外还介绍了 Sun 为帮助用户执行迁移操作而提供的一些非常有用的工
具的相关信息。
Solaris 10 OS 和 Linux 概述
Solaris 10 OS 是一个成熟、可靠、安全、高性能并且可伸缩的操作系统,适用于关键业务应用程序。除了功
能非常丰富之外,其核心是与 POSIX 兼容的 UNIX® 系统,由 UNIX System V Release 4 (SVR4) 衍生而来,
后者由 Sun 和 AT&T 联合开发。缺省情况下, Solaris OS 提供一组丰富的命令、实用程序和库,它们与
POSIX 兼容。详细的 2004 年修订版的 POSIX 标准,可以从
toc.htm 获得。
为了提高与其他 UNIX 变体的兼容性, Solaris 软件还捆绑了 Berkeley 软件分发 (Berkeley Software
Distribution, BSD) 产品的 UNIX 变体中的命令、实用程序和库。Solaris OS 在基于 SPARC® 处理器和 x86/
x64 处理器的系统上均可运行,并且在 SPARC 处理器体系结构和 x64 处理器体系结构上均支持 32 位应用程
序和 64 位应用程序。已证明 Solaris OS 符合大多数主要的行业标准,包括 X/Open®XPG4、XTI、UNIX98、
POSIX 和 FIPS。
Sun 已开始通过 OpenSolaris™ 操作系统开放大部分 Solaris 代码库的源代码。这是首次商业品牌的 UNIX 源
代码开放行动。开放源代码社区一直致力于这项工作,并开发出已投入使用的 OpenSolaris 软件。
OpenSolaris 操作系统依靠社区开发力量得到迅猛发展,为那些希望主动参与操作系统的开发和完善的开发
者及用户提供了很好的协作机会。Solaris 10 OS 中大多数先进的功能在 OpenSolaris OS 中也可以使用。因
此,我们在本指南中讨论的许多内容同样适用于 OpenSolaris 目标平台。
Linux (例如 OpenSolaris)是一种常用的开放源代码 OS,用户群在不断扩大。经过多年的发展, Linux 已
经很成熟,提供几乎与 POSIX 完全兼容的开发和部署环境。Linux 也不同程度地表现出与 BSD UNIX 和
SVR4 兼容的行为。在过去几年中,一些领先的 Linux 供应商已同意遵循现在称为 Linux 标准库 (Linux
Standard Base, LSB) 的标准。遵循 LSB 标准确保可以将一组标准的 API 用于计划中可移植的应用程序。尽
管 Linux 可以在许多体系结构上运行,但是在 x86/x64 体系结构上部署更为常见。在本文档中,为了简便起
见,我们将 Red Hat Enterprise Linux 3 (RHEL3) 和 Red Hat Enterprise Linux 4 (RHEL4) 作为代表性的 Linux 环
境加以介绍。
通常所称的“Linux 应用程序”是指已编译为可在 Linux 内核上运行的开放源代码程序。其中许多应用程序
已针对 Solaris OS 内核进行编译,几乎没有对源代码进行任何功能上的更改。
Sun 作为开放源代码软件的领导者,在 Solaris 10 OS 中开发了许多功能,使其成为开放源代码应用程序和
Linux 互操作性使用的主要平台。Sun 以打包二进制文件的形式为每个 Solaris OS 版本提供了许多开放源代
码命令、实用程序和开发工具;其中的许多程序在 Linux 分发中也可以找到。大多数软件包作为 Solaris
Companion CD 中的 Solaris 10 分发的一部分提供,安装在目录 /usr/sfw 中。这些软件包的最新版本以及
其他相关信息可以从 获得。将这些附加的软件包安装在 Solaris OS 上之后,即可帮助
用户实现与 Linux 中的功能相当的开放源代码功能。
2- 介绍Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
由于 Solaris OS 和 Linux 均提供 POSIX 功能,而且 Solaris 10 OS 捆绑了许多 Linux 互操作性功能,Linux 与
Solaris OS 之间的关联与以前相比得到了显著增强。很自然,用户都期望可以很容易地将应用程序从 Linux
移植到 Solaris。大多数最新的 Linux 分发均符合 LSB 2.0 标准,这使移植任务变得更加容易。但是实际上,
移植应用程序需要进行一些非常认真细致的工作。使用特定于体系结构的扩展和特定于 OS 的扩展、内核空
间授权访问、设备直接访问和不受支持的编译程序扩展的应用程序需要进行更多的工作。不遵守可移植代
码规范的应用程序将必定需要涉及更多的工作。
Sun 提供的帮助
Sun 为将应用程序从 Linux 移植到 Solaris OS 提供了相关的工具、指南和帮助。
如果应用程序的源代码不可用, Sun 将提供一种方式,可以在使用 Solaris OS 的 x86/x64 系统上运行基于
Linux x86 的应用程序二进制文件。这个称为 lxrun 的免费实用程序可供下载;请参见
。Lxrun 是位于 Solaris 与 Linux x86 二进制可执行文件
之间的仿真程序,“即时”重映射系统调用,使其无需修改即可在针对 x86 的 Solaris OS 平台上运行。有关
此实用程序的更多信息,请参见 lxrun(1) 手册页。
BrandZ 扩展了 Solaris Zones,以创建支持非本地操作环境的标记区域 (branded zone)。每个不同的环境通过
插入 BrandZ 框架中的一个标记 (brand) 提供支持。标记可能很简单,例如将本地 Solaris OS 实用程序替换为
等效的 GNU 实用程序的环境,也可能很复杂,例如完整的 Linux 用户环境。lx 标记使 Linux 二进制文件
无需修改即可在 Solaris 10 OS 的区域 (zone) 内运行。有关更多信息,请参阅:
community/brandz。
有时,可能更适合对应用程序进行全面移植,以便为 Solaris OS 创建本地二进制文件。这样,复杂的应用程
序和 ISV 产品可以最大程度地发挥 Solaris 10 发行版提供的成熟平台的优势。如果现有的 Linux 应用程序需
要移植到 Solaris 10 OS,在开始此类项目之前,确定代码中可能会出现问题的区域会很有用。
Sun 提供源代码扫描工具来分析 C/C++ 源代码文件,并确定代码和功能的兼容性问题。可以使用 Sun 应用
程序移植助理 (Sun Application Porting Assistant, SunAPA) 确定 C/C++ 源代码文件中的移植问题。此实用程序
会分析大多数妨碍将源代码文件从 Linux 移植到 Solaris OS 的已知问题。SunAPA 可以确定可能出现的问
题,并且可以提供以下信息:
• 确定可能存在移植问题的函数调用。Sun APA 确定源代码中出现这些问题的总次数以及出现问题的位置。
• 指示解决问题的难度级别,并提供详细的帮助信息来帮助您解决问题。
• 应用程序的大小(文件总数和代码行总数)。
• 直观的界面,可以快速浏览所有移植问题。
使用 SunAPA 可以为参与大型项目的开发者节省大量的时间和精力。
在实际工作中,很希望在此类迁移项目中采用一种系统的、面向进程的方法。在第 44 页的附录 G 中,我们
推荐了一个将应用程序迁移到 Solaris 10 OS 的典型流程。
3- 介绍Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
其他资源
Sun 还为开发者和管理员提供了与此主题有关的其他基于 Web 的资源。Sun 提供专门针对 Linux 管理员的课
程,全面介绍 Solaris OS 及其相关的 IT 基础结构。除了核心技术之外,这些课程重点介绍系统、网络和应
用程序的管理。这些课程进行了颇有价值的深入探讨,以帮助管理员快速了解有关从 Linux 迁移到 Solaris
OS 的各种问题。同样,为刚开始使用专业的开发者工具(例如 Sun™ Studio 11 软件)的开发者提供了大量
基于 Web 的资源。
有关从 Linux 迁移到 Solaris OS 平台的详细信息,请参见 Sun Web 站点上有关迁移的部分:

4-Linux 与 Solaris 10 OS 的关联Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 2 章
Linux 与 Solaris 10 OS 的关联
Solaris 10 OS 采用模块化设计,可以适应新的处理器体系结构和硬件体系结构(图1)。该设计还支持逐步
添加新服务。早期 Solaris 版本中大多数已知的属性(例如可靠性、可用性、安全性、可伸缩性、易管理性
和互操作性)都已进行改进,可以在 Solaris 10 发行版中充分发挥其作用。有关 Solaris 10 OS 的更全面的信
息,请访问位于以下位置的白皮书: self.pdf。
Solaris 10 OS 是托管大规模关键业务应用程序(尤其是当前在 Linux 上运行的此类应用程序)最常用的平台
之一。Sun 已在 Solaris 10 OS 中开发了许多功能,使其可以与 Linux 兼容。
图1. Solaris 操作系统的模块化设计有助于其迅速发展,以适应新的技术和业务模型。
此外, Solaris 10 OS 包含数百个标准的 Linux 命令、工具、实用程序和服务。这些软件包基于为 Linux 提供的
同一个开放源代码库进行开发。这些软件包作为 Solaris Companion CD 的一部分分发,安装在目录 /usr/sfw
中。大多数软件包的最新版本及其相关信息还可以从 免费下载。
借助这些软件包以及标准的 Solaris 功能,几乎可以满足所有 Solaris 用户的需求。用户可以选择使用这些类
似于 Linux 的软件包,从而显著增强了与 Linux 的关联。请注意,可能需要适当地更改 shell 的环境变量
(例如 PATH),以便优先使用这些类似于 Linux 的命令和服务。
正如您所想的那样,表1 按不同类别列出了 Linux 和 Solaris OS 中的部分常用开放源代码工具。
5-Linux 与 Solaris 10 OS 的关联Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
表1. Solaris 10 OS 和 Linux 中支持的常用开放源代码工具
鉴于 Solaris 10 OS 在平台服务、命令、工具、库和软件开发环境方面已提供了一个非常重要的 Linux 基准,
因此将应用程序移植到 Solaris OS 的任务可以归结为需要修改的实际代码。如果在两端均使用相同的开发工
具和编译器,则与工具有关的移植复杂性就会大大降低。
需要注意的很重要的一点是, GNU 编译器集合 GCC 和其他 GNU 工具在 Linux 和 Solaris OS 中均可以使
用。Sun 已使 Sun Studio 11 编译器和工具无需支付任何许可费用,即可在 Solaris 和 Linux 平台上使用。
通常,用户会发现开发者在 Linux 端喜欢使用 GCC 工具链,而在 Solaris 端喜欢使用 Sun 提供的开发工具。
有时,某些移植情况还可能要求在 Solaris 端使用更专业的工具。Sun Studio 11 软件就属于此类工具,在
Solaris 开发者中很常用。Sun Studio 11 产品拥有自己的一组编译器和工具。在这种情况下,开发者将需要了
解 GNU 工具与 Sun Studio 11 工具之间在语义和语法方面的一些细微差异。我们将在本文档后面介绍其中的
部分差异。
类别工具名称
GNU 命令集用于访问、文件处理、编辑、通信等操作的所有常用 UNIX 命令
Shell Bash
脚本Bash、Perl、Python、Tcl/Tk、gawk、sed
GUI 和 GUI 开发GNOME、KDE、GTK+
GCC 编译器和运行时库C、C++、G77、glibc 等等
GNU 软件开发工具ld、ldd、lorder、ar、elmdump、gmake、ant、nm、gprof、RCS、CVS
GNU 调试工具和派生工具Gdb、DDB
Web 服务Apache、Tomcat、JBoss
Java™ 技术服务Sun JRE、Sun JDK
6- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 3 章
迁移问题
处理器体系结构问题
小端字节序与大端字节序
源平台和目标平台中字节排序方面的问题可能是问题的根源。在计算机内存中存储信息的方法以及其中的
字节排序方式称为字节存储顺序 (endianness)。如果任何多字节数据字段的最高有效字节 (Most Significant
Byte, MSB) 存储在内存地址的最低位,则该系统称为大端字节序 (big-endian) 系统。如果任何多字节数据字
段的最低有效字节 (Least Significant Byte, LSB) 存储在内存地址的最低位,则该系统称为小端字节序 (littleendian)
系统。Intel 处理器和 AMD Opteron™ 处理器采用小端字节序,意味着最低有效字节存储在地址的最
低位。相反, SPARC 处理器采用大端字节序。以下面的示例为例:
在 Intel 或 AMD Opteron 处理器中以小端字节序格式存储 0X01020304,假设采用 4 字节存储,如下所示:
在 SPARC 处理器中以大端字节序格式存储同一个数字 0X01020304,假设采用 4 字节存储,如下所示:
Solaris OS 在大端字节序模式(SPARC 处理器)和小端字节序模式(Intel 处理器或 AMD Opteron 处理器上
的 x86/x64 版本)下均可以使用。Solaris OS 的一项优势在于它可以透明地处理字节存储顺序问题,使 ISV
或开发者不必过于关注其应用程序何时可以在针对 UltraSPARC® 处理器的 Solaris OS 平台或针对 x86/x64
(对于 Intel 或 AMD Opteron 处理器)的 Solaris OS 平台上使用。Sun 的软件体系结构允许重新编译针对
SPARC 的 Solaris OS 平台上的大端字节序应用程序,以便在针对 x86/x64 的小端字节序 Solaris OS 平台上运
行。通常,不需要进行重新工程 (re-engineering)。但是,字节存储顺序的不同可能会导致出现问题,特别是
当应用程序使用低级代码来处理单词内的字节时,就更容易造成问题。
通常数值数据内的字节排序对于应用程序也是透明的,但下列情况除外:
• 通过网络发送数据: 标准 C 库提供下列例程:ntohl()、ntohs()、htonl() 和 htons(),以便在
网络字节顺序和主机字节顺序之间转换数值数据。这些例程在主机平台上实现,用于处理主机字节顺序
与网络字节顺序之间的转换,应始终使用这些例程将应用程序与底层网络字节排序隔离。
• 使用指针访问数值数据的各个字节: 如果使用数值数据类型的各个字节存储和检索值,由于底层平台的
字节存储顺序属性的不同,可能会得到不同的结果。在这种情况下,代码不可移植。例如:
00000100 00000011 00000010 00000001
内存地址: 100 101 102 103
00000001 00000010 00000011 00000100
内存地址: 100 101 102 103
7- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Intel 处理器或 AMD Opteron 处理器中的值 0X01020304 (小端字节序格式)
在此示例中,小端字节序计算机将输出 4,大端字节序计算机将输出 1。若要使此代码可移植,应使用各个
字符型变量存储这些值,而不是使用数值数据类型存储这些值。此外,可以对每个值使用包含各个字段的
结构,并使用结构字段名获取和设置这些值。
应用程序数据存储
通常,所开发的文件系统不采用任何字节存储顺序,因此在 SPARC 版本与 x86/x64 版本的 Solaris OS 之间
交换文件并不存在什么问题。但是,存储可在平台之间共享的原始数据的应用程序可能会出现问题。例如,
如果针对 SPARC 的 Solaris OS 平台上的应用程序以原始格式将数据结构写入文件,这些文件中存储的数据
将采用特定字节存储顺序。从基于 Intel 处理器或 AMD 处理器的 Solaris 系统中读取或写入这些数据文件
时,可能会出现与数据字节存储顺序有关的问题。简而言之,文件中存储的二进制数据(原始数据)通常
无法在 SPARC 平台与 x86/x64 平台之间传输。
对于存储可在平台之间共享的数据的应用程序,可通过下列两种方式之一处理字节存储顺序问题:
• 使用文本文件和字符串,以应用程序定义的、不采用任何字节存储顺序的格式存储数据。
• 选择大端字节序或小端字节序约定,并在必要时使用外部数据表示 (External Data Representation, XDR) 库
之类的技术执行字节交换。
需要跨平台兼容性很容易理解,所以,多年以来,主流的应用程序一直可以在大端字节序 Solaris 环境和小
端字节序 Solaris 环境中使用,不会出现任何问题。范围涵盖了从个人办公软件应用程序到包括 Oracle、
Informix 和 Sybase 在内的供应商提供的主要数据库管理系统。
00000100 00000011 00000010 00000001
内存地址: 100 101 102 103
int flagVal = 0X01020304;
char *cptr = (char *)&flagVal;
printf("Val is %d\n", *cptr);
8- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
存储顺序和对齐
不同平台的数据存储顺序有所不同,因此,需要使用特定存储顺序的代码不可移植。以下面的示例为例:
此示例中的代码假定 year 将存储在 month 之前。此代码在 x86 平台上可以正常运行,但是在基于 SPARC
处理器的计算机上不能正常运行。为了避免出现此类潜在的错误情况,可移植代码应分别比较结构变量的
各个字段,而不应依靠存储顺序。例如:
在不同平台上,结构中的字段成员的对齐方式有所不同,因此,填充要求会不同,结构的大小也会不同。
为了使代码可移植,应始终使用 sizeof 运算符访问结构大小。
struct date
{
char yr;
char mon;
char day;
char x; // struct var size is 4
} planned_date, end_date;
if ( (*(long * )&end_date) > (*(long *)&planned_date))
{
printf("Sorry, You missed the deadline for migrating to Solaris \n");
}
if (compare_dates(end_date, planned_date) > 0)
{
printf("Sorry, You missed the deadline for migrating to Solaris \n");
}
int compare_dates(struct date date_to_compare, struct date
date_compare_against)
{
if (date_to_compare.year != date_compare_against.year)
return (date_to_compare.year - date_compare_against.year);
if (date_to_compare.month != date_compare_against.month)
return (date_to_compare.month - date_compare_against.month);
if (date_to_compare.day != date_compare_against.day)
return (date_to_compare.day - date_compare_against.day);
}
9- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
读/ 写结构
大多数程序使用标准的 C 例程,在永久性存储介质上以完整的二进制结构读取和写入数据。这些例程需要
知道所读取或写入的数据大小。由于不同平台上的对齐方式和数据类型大小不同,结构大小也会有所不同,
因此,应使用 sizeof 运算符指定在这些例程中要读取或写入的字节数。
例如,如果程序需要读取一条 MyRecord 类型的记录(您知道数据共有 25 个字节),则不应编写以下代码:
而应使用以下约定:
32 位和 64 位问题
Solaris OS 和 Linux 在 32 位处理器和 64 位处理器上均可以运行。UltraSPARC 处理器是 64 位处理器。Intel
和 AMD 提供的 x86 兼容处理器是 32 位处理器,缺省地址空间为 4 GB。Intel EM64T 和 AMD Opteron 处理
器系列是 64 位处理器,支持 64 位的地址空间。但是,这些处理器也可以在 32 位兼容模式下运行,并可运
行任何传统的 32 位兼容应用程序。Solaris 10 OS 配备完整,可以处理其运行平台上固有的 32 位和 64 位问
题。只有编写应用程序不当,对不同数据类型的大小以及不同数据类型之间的转换进行了假定,才会出现
该问题。
C 语言规范不为其整型数据类型指定任何大小,只表明其关系,如下所示:
各种数据类型的大小由操作环境所使用的数据类型模型确定。32 位 OS 使用 ILP32 数据模型,该数据模型
指定 int、long 和 pointer 数据类型的大小是 32 位(因此称为 ILP32)。
64 位 OS 采用的是行业标准的 LP64 数据类型模型。LP64 数据类型模型指定 long 和 pointer 数据类型
的大小是 64 位,并未修改其他数据类型的大小。32 位 OS 和 64 位 OS 中不同数据类型的大小关系如表2
中所示。
MyRecord myrecord;
fread(&myrecord, 25, 1, fp);
MyRecord myrecord;
fread(&myrecord, sizeof(MyRecord), 1, fp);
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
10- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
表2. 32 位版本和 64 位版本的 Solaris 10 OS 的数据类型大小
为了向后兼容, 64 位 OS 上也支持 32 位 OS API,并且不需要对应用程序进行任何更改。将 32 位应用程序
转换为 64 位应用程序时,理想的情况是只需要重新编译并与 64 位的库重新链接。实际上,大多数应用程
序将需要对代码进行一些更改和清理,以便在 32 位 OS 和 64 位 OS 上均可以运行。
如果 32 位和 64 位的 API 版本不同,最好使用 #ifdefs 对不同的代码片段进行条件编译。这样做要好于为
两种 OS 维护不同的源代码文件,不过,为了便于阅读,应尽量少使用这种方式。Solaris 平台和 Linux 平台
均为数据类型模型提供了功能测试宏。有关 Solaris OS 的功能测试宏的更多信息,请参阅《Solaris (64 位)
开发者指南》(网址为:)。
ILP32 数据类型模型不区分 int、long 和 pointer 数据类型,因为这些数据类型的长度都是 32 位。然
而,在 LP64 数据类型模型中, long 和 pointer 数据类型的大小是 64 位。因此,大多数代码问题可能源
于这些数据类型使用不当。下列指南有助于避免出现可能的 32 位和 64 位移植问题:
1. 应纠正 int、long 和 pointer 数据类型可互换的用法,以避免可能出现的数据丢失。
2. 对地址的显式算术处理应替换为等效指针算术表达式。
3. 应检查联合字段和结构字段对数据类型大小更改的影响。
4. 检查所有应用程序中的内部数据结构是否存在漏洞。在结构字段之间使用额外的填充,以便在 LP64 数
据类型模型中, long 和 pointer 字段可以增长为 64 位。
5. 由于标准的 C 转换规则受数据类型大小更改的影响,所以,表达式的计算可能会受到影响。应使用显式
强制类型转换,并声明常量类型(对整型常量使用 u、U、l、L、f 和 F 后缀),以得到所需的一致
结果。
6. 代码转换为 64 位时,应始终使用显式强制类型转换,以实现预期的结果。这样可以避免由于 C 语言的
转换规则而出现符号扩展问题。int 提升为 unsigned int 时,就会出现此转换问题。
7. C 编译器假定模块中使用的、未在外部定义或声明的任何函数或变量都是整型数据。在 LP64 数据类型
模型中,只要以 long 或 pointer 数据类型使用这些函数和变量,就会发生截断。
8. 在 LP64 数据类型模型中, sizeof 运算符的有效类型是 unsigned long。因此,在传递给 int 数据
类型或强制转换为该数据类型时应小心,因为这可能会造成数据丢失。
9. 由于数据大小的增大,可能会影响应用程序的性能,并且可能需要更多地修改代码来提高性能。
10. 如果从外部接口发送或接收数据,请确保所发送的数据大小与外部接口期望的大小相同,反之亦然。
C 数据类型ILP32 数据模型LP64 数据模型
char 8 位8 位
short int 16 16 d
int 32 32
long 32 64
float 32 32
double 64 64
pointer 32 64
enum 32 32
long long 64 64
long double 128 128
11- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
多线程编程
大多数现代操作系统都使用多线程的方式来提高计算的粒度,以便更有效地利用可伸缩环境中的资源。
内核模式和用户模式的服务均依靠通过操作系统实现的底层线程模型。为保持不同数据结构的完整性并使
系统上运行的所有线程和进程实现可控的并发性,应使用互斥锁和信号量之类的实体。但是,具体的实现
细节可能会截然不同,即使在类似于 UNIX 的操作系统之间也是如此;这些细节是移植项目中存在的潜在
问题。
Solaris OS 内核本身支持线程。内核在内部调度线程,从而以最佳的方式共享可用的 CPU 资源。这些内核
线程绑定到轻量级进程 (Lightweight Process, LWP)。
多年来,Solaris OS 版本已采用多种线程实现方式。Solaris 线程一直处于非常重要的地位。但是,随 Solaris
OS 提供的 POSIX 线程库已成为实际的标准,因为通过该线程库可以很容易地在 UNIX 平台(包括 Linux)
之间移植应用程序。有关 Solaris 线程的更详细的说明,请参阅由 Jim Mauro 和 Richard McDougall 合著的
《Solaris Internals》,该书由 Sun Microsystems Press 出版。使用线程进行编程需要具备更高的技能。由 Steve
Kleiman、Devang Shah 和 Bart Smaalders 合著的《Programming With Threads》是有关该主题的一本很不错
的参考书。
在 Linux 端,有多种线程软件包实现方式,多年来,这些软件包已得到明显的改进。总的来说,这些实现
方式与 POSIX 兼容。但是,实现方式的不同会造成性能问题。基于内核版本 2.2 和 2.4 的 Linux 分发支持
Linux 线程。为了便于使用 Solaris 线程移植 Solaris OS 应用程序,可以使用另一个称为 Solaris 兼容线程库
(Solaris Compatible Thread Library, SCTL) 的开放源代码软件包。Linux 2.6 内核捆绑了一个新的线程模型,称
为本地 POSIX 线程库 (Native POSIX Thread Library, NPTL),效率可以提高很多。
尽管实现方式不同,但大多数调用线程库的语法非常类似,均符合 POSIX 线程标准。因此,从移植的角度
来说, Linux 端的线程库调用可移植到 Solaris 10 OS。当然,用户必须清楚线程库在 makefile 的链接程序命
令中的顺序和名称。通常, -lpthreads 是用于访问 Solaris 平台上的 POSIX 线程的链接程序选项。
如果由于任何特定原因,用户希望使用 Solaris OS 上的 Solaris 线程,则需要花费更多的精力来更改代码,
并将 POSIX 线程调用替换为 Solaris 线程调用。同时,用户还需要分析代码的语义准确性。表3 列出了
Solaris 线程和 POSIX 线程之间的对应关系。
表3. Linux 线程函数与 Solaris OS 线程函数之间的对应关系
编号 POSIX 线程函数Solaris 线程函数
1 pthread_create() thr_create()
2 pthread_exit() thr_exit()
3 pthread_getschedpa ram() thr_getprio()
4 pthread_getspecifi c() thr_getspecific()
5 pthread_join() thr_join()
6 pthread_key_create () thr_keycreate()
7 pthread_kill() thr_kill()
8 pthread_self() thr_self()
9 pthread_setschedpa ram() thr_setprio()
10 pthread_setspecifi c() thr_setspecific()
12- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Solaris OS 支持进程间互斥锁以及条件变量资源同步。除了 POSIX 规范之外, Solaris OS 还提供一种方便的
读/ 写锁定机制,以控制对共享资源的访问。
但是,Solaris 线程 API 与 POSIX 线程 API 之间会存在一些区别。例如,POSIX API 不支持下列 Solaris 线程
API:
• thr_continue()
• thr_getconcurrency()
• thr_main()
• thr_minstack()
• thr_setconcurrency()
• thr_suspend()
同样,下列 POSIX 线程 API 也没有等效的 Solaris 线程 API:
• pthread_once()
• pthread_equal()
• pthread_cancel()
• pthread_testcancel()
• pthread_cleanup_push
• pthread_cleanup_pop()
• pthread_setcanceltype()
• pthread_setcancelstate()
但是,前面两个 API 集均可以安全地在 Solaris OS 上的同一个程序中使用。
11 pthread_sigmask() thr_sigsetmask()
12 sched_yield() thr_yield()
13 pthread_mutex_destroy() mutex_destroy()
14 pthread_mutex_init () mutex_init()
15 pthread_mutex_lock () mutex_lock()
16 pthread_mutex_trylock() mutex_trylock()
17 pthread_mutex_unlock() mutex_unlock()
18 pthread_cond_broadcast() cond_broadcast()
19 pthread_cond_destroy() cond_destroy()
20 pthread_cond_init () cond_init()
21 pthread_cond_signal() cond_signal()
22 pthread_cond_timedwait() cond_timedwait()
23 pthread_cond_wait () cond_wait()
编号 POSIX 线程函数Solaris 线程函数
13- 迁移问题Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Linux 不支持可在不同进程之间共享的可共享同步对象(互斥锁、信号量和条件变量)。因此,调用下列函
数时将 PTHREAD_PROCESS_SHARED 用作第二个参数将失败:
• pthread_mutexattr_setpshared()
• pthread_condattr_setpshared()
• pthread_rwlockattr_setpshared()
信号量
Solaris OS 和 Linux 均为信号量提供了 POSIX 接口。Solaris 实现与 POSIX 实现兼容。在 Solaris 端,可以使
用以下两个函数集中的任何一个(表4)。
表4. POSIX 信号量函数与 Solaris OS 信号量函数之间的对应关系
编号POSIX 信号量函数Solaris 信号量函数
1 sem_destroy() sema_destroy()
2 sem_init() sema_init()
3 sem_post() sema_post()
4 sem_trywait() sema_trywait()
5 sem_wait() sema_wait()
14- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 4 章
软件开发工具
编译器的差异
值得注意的是, Solaris 10 OS 将 GNU 编译器和工具链作为 OS 分发的一部分提供。Sun Studio 11 开发工具
也可以在 Solaris OS 上使用,现在,这些开发工具无需支付任何许可费用,即可在 Linux 上使用。因此,开
发者在两种平台上都可以使用 GNU 和 Sun Studio 11 工具。
但是, Solaris 开发者以前在 Solaris OS 中一直使用 Sun Studio 编译器,而大多数 Linux 程序员则使用 GNU
编译器。这可能会导致在移植应用程序期间出现一些问题。这些编译器使用不同的命令行选项选择不同的
模式。不存在任何标准的命令行选项格式,但是,两种编译器均认可表5 中所示的选项的格式和功能。
表5. GNU 工具与 Sun Studio 软件之间等效的命令行选项
有关编译器命令行选项中的差异的列表,请参阅第 30 页的附录 A 。有关 Solaris 链接程序和 GNU 的链接程
序选项及其变体的列表,请参阅第 36 页的附录 B 。除非另行说明,否则,命令行选项对于所有受支持的处
理器(即 SPARC、x86 和 x64)均有效。
Sun Studio 编译器集合和 GNU 编译器均扩展了 C 语言。Sun Studio 编译器使用 #pragma 进行扩展,而 gcc
使用 ____ 序列后跟两个左圆括号,以便向对象定义或声明中添加信息。
除非使用 -Wall 选项,否则, Gcc 将忽略 #pragmas 选项;此时,只警告被忽略的 #pragmas 的有关信
息。应避免使用此语言扩展约定,因为这会严重地影响代码的可移植性。有关兼容的 #pragmas 和
____ 序列的列表,请参阅第 38 页的附录 C 。第 41 页的附录 D 显示了 Sun
Studio 软件提供的内联汇编工具中的变体。
命令行选项说明
-c 指示编译器进行编译,但不进行链接
-o FILE 指定输出文件
-I DIR 添加 include 搜索目录
-L DIR 添加库搜索目录
-lname 搜索并添加名为 libname.a (或 .so)的库
-Aname[(token)] 定义 ISO C 断言
-Dname[=val] 定义预处理程序宏
-Uname 取消预处理程序宏的定义
-g 指示编译器发出调试信息
-E 只执行预处理,并将结果写入标准输出或使用 -o 指定的文件
-S 指示编译器编译(而不是汇编)代码
-w 禁止输出警告
15- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
源代码和版本控制
在任何涉及大型团队和包含大量代码的大型项目中,必须具备有效的软件配置管理 (Software Configuration
Management, SCM) 工具。这样有助于在代码更改实践中引入规程,从而实现相应级别的版本控制,确保完
整性、可跟踪性和可说明性。在移植项目中,同样需要拥有对项目中使用的平台、语言和脚本透明的 SCM
工具。一些比较新的工具(例如 Subversion 和 Ant)可以很好地实现这一功能。
C/C++ 应用程序开发者仍喜欢使用传统的 UNIX 工具(例如 SCCS、RCS 或 CVS)。Sun Studio 软件也提供
类似的工具。我们介绍了在源代码控制中可能面临的问题。
源代码控制
Linux 为管理源代码提供了 RCS (Revision Control System,版本控制系统),而 Solaris OS 为管理源代码提
供了 SCCS (Source Code Control System,源代码控制系统)。这些软件包提供兼容的功能,但是使用不同
的格式来存储代码更改以及处理代码更改的命令。若要将源代码从一个系统移植到另一个系统,应从 Linux
系统中提取最新的代码,然后手动或使用自定义脚本将代码传输到 Solaris 系统。
CVS (Concurrent Versions System,并发版本系统)是对网络透明的主要开放源代码版本控制系统,在
Solaris OS 和 Linux 上均可以安装。CVS 对独立开发者以及大型分散团队都很有用。第 43 页的附录 F 提供
了常用的 RCS 命令列表及其与 SCCS 和 CVS 的对应关系。
CVS 与 RCS
RCS 很容易设置,在小型项目中很有用。通过支持文件锁定功能,禁止多个开发者修改同一个文件。
CVS 基于 RCS 生成,比 RCS 更加灵活。CVS 比 RCS 更加强大和灵活,CVS 可以通过使用脚本来提供任意
级别的文件锁定功能。CVS 的主要目的是提供一组分组功能,使您可以将一组 RCS 文件作为单个对象对
待。CVS 提供客户机/ 服务器支持,团队可以通过网络从不同站点使用同一个 CVS 系统信息库。
RCS 不直接支持的其他 CVS 功能包括:
• 无限制检出,使多个开发者可以同时处理同一个文件
• 从其他源代码控制系统自动导入“供应商分支”并合并更改
• 提交序列化
在从 Linux 移植到 Solaris 的项目中,用户很可能会经历将系统信息库从 RCS 迁移到 CVS 的阶段。此任务相
对简单,因为 RCS 文件作为 CVS 系统信息库的一部分受到直接支持。许多迁移工作都围绕着构建系统信息
库、添加 CVS 所需的新文件(模块和日志信息等)以及将 RCS 文件物理移动到新的 CVS 系统信息库来进
行。若要从 RCS 转换为 CVS,可以执行下列步骤:
1. 使用 find 命令查找所有 RCS 文件。
2. 创建相应的 CVS 目录。
3. 将每个 RCS 文件复制到 CVS 系统信息库的相应目录中。
16- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
应用程序生成
Make 文件
Solaris OS 和 Linux 均提供 make 实用程序,可用于根据源代码文件生成应用程序。make 实用程序以递归
方式作用于 makefile,该文件说明目标文件与其依赖项之间的关系。
在 Linux 中, GNU make 按以下顺序搜索 makefile:
1. ./GNUmakefile
2. ./makefile
3. ./Makefile
此外,如果需要, GNU make 可以隐式从 RCS/SCCS 目录中提取文件。
Solaris make 实用程序按以下顺序搜索 makefile:
1. 非 POSIX 模式
• ./makefile
• 如果 ./SCCS/s.makefile 存在,则将尝试检索 makefile 的最新版本。
• ./Makefile
• 如果 ./SCCS/s.Makefile 存在,则将尝试检索 makefile 的最新版本。
2. POSIX 模式
• ./makefile、./Makefile
• s.makefile、SCCS/s.makefile
• s.Makefile、SCCS/s.Makefile
两个版本的 make 采用兼容的命令行选项。有关详细信息,请参阅第 42 页的附录 E 。
此外,还可以使用 GNU make。该软件可以从 Sun 免费软件站点 获得。
iMake 实用程序
imake 处理包含所有 makefile 通用的定义的模板文件(缺省文件是 Imake.tmpl)。模板文件包含表6
中所述的文件。
表6. imake 使用的模板文件
文件名说明
体系结构定义文件包含一系列条件块,用于确定平台和计算机的体系结构。
特定于平台的定义文件在条件块中设置特定于平台的生成参数。
特定于本地站点的定义文件
在所有平台上设置特定于应用程序的生成参数。(本地文件中的定义应位
于条件块中,以便特定于平台的文件可以覆盖这些定义。)
项目配置文件包含特定于项目的变量定义。
17- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
有关 imake 的详细信息,请参阅归档文件《Software Portability with imake》(第二版),其网址为:

应用程序打包
软件打包是一项重要的任务。使用合适的打包机制可以简化安装、删除和验证软件的过程。这些活动当中
的每一项都要求细致而准确的用户干预,因此应尽可能最大程度地自动完成这些任务。
过去, Linux 一直使用名为 RPM (Red Hat 软件包管理器)的工具来安装、卸载和验证软件。RPM 可能不
是最先进的软件包管理器,在 Linux 领域中还存在一些更好的工具。但是,基于 RPM 的打包已经过实践的
检验,使用非常普遍。
Solaris 软件使用一种非常复杂的打包格式,称为 pkgadd 格式。pkgadd 工具集是在 UNIX SVR4 和 Solaris
OS 上安装、卸载和验证软件包的缺省工具。此工具集也已经过时间的检验。但是,使用此打包方法可能需要
进行更多的脚本编写工作。在任何情况下,与基于 RPM 的打包脚本相比,使用 pkgadd 更加复杂。
因为打包脚本通常与生成应用程序二进制文件的 make 脚本驻留在一起,所以,最好尽可能减少这些脚本中
的更改,并选择基于 RPM 的应用程序打包,即使在 Solaris 10 平台上也是如此。
开发工具
Linux 工具
Linux 提供多种开发工具,其中部分工具在表7 中列出。有关 Linux 可用的开发工具的列表,请参阅
Linux.org Web 站点:。
表7. Linux 开发工具
规则定义文件包含宏方面的规则定义。
Imakefile (在当前目录中)
包含 make 变量和宏调用的定义。使用规则文件定义的规则生成
makefile 的必要部分。
模板文件将一组公用规则附加到 makefile 的底部,可以用于生成应用程序。
Linux 工具说明
Sun™ Studio 编译器集合
支持多种语言(例如 C、C++、Java 和 Fortran 编程语言)的集成开发环境 (Integrated
Development Environment, IDE)。在编写本文档时,只有一个早期访问版本可以在 Linux
上使用。
Builder Xcessory PRO Motif 最主要的用户界面生成器
CENV C 和 C++ 的小型开发环境
Portable.Net 可移植的工具套件(包括 C# 编译器、汇编程序和运行时引擎)
Mork Java 技术的编译器工具
GTK 对象生成器
(GTK Object Builder, GOB) 可很容易地创建 GTK 对象的简单预处理程序
18- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Solaris 10 OS 开发环境
Cool Tools
Cool Tools 是一组工具,可以广泛地满足 CMT (Chip Multi-Threaded,芯片多线程)社区的需要。这些工
具可:
• 采用 CoolThreads™ 技术为基于 UltraSPARC T1 处理器的系统提供优化的开发环境,增强 Sun Studio 软件
功能。
• 自动完成包括编译、测试、错误检测和性能调优在内的应用程序开发周期。
• 分析并提高 UltraSPARC T1 系统中的应用程序性能。
• 简化在 UltraSPARC T1 系统中部署/ 配置应用程序的过程。
• 确定其他系统中当前运行的应用程序/ 工作负荷是否适合迁移到基于 UltraSPARC T1 处理器的系统。
可以从 免费下载下列 Cool Tools。该站点还提供有关每个工具的更多信息以及
如何获得支持的信息。
• 适用于 SPARC 系统的 GCC (GCC for SPARC System, GCC4SS)
GCC4SS 是一个 C/C++ 编译器,可以显著提高 SPARC 系统中通常使用 gcc 编译的应用程序的性能,该
编译器扩展了 GCC,可以针对基于 SPARC® 处理器的系统使用优化的 Sun 代码生成器。以下编译器命令
与 GCC 相同:gcc 和 g++。所有 GCC 命令行选项都存在,并且存在更多的选项,例如 -O3 和 -fast,
用于提升优化级别:过程间优化 (-xipo)、配置文件驱动的优化 (-xprofile)。
使用适用于 SPARC 系统的 GCC 编译的程序与通过 GCC 编译的程序采用相同的应用程序二进制接口
(Application Binary Interface, ABI)。可以混合并匹配适用于 SPARC 系统的 GCC 编译的对象和 GCC 编译的
对象。
• 二进制文件改进工具 (Binary Improvement Tool, BIT)
二进制文件改进工具 (Binary Improvement Tool, BIT) 直接处理 SPARC 二进制文件,以检测、优化和分析
这些文件的性能或代码适用范围。BIT 是包含用于处理 SPARC 二进制文件的各种资源的工具。它可以检
测和分析二进制文件,提供准确计数的运行时信息,以便分析性能或适用范围。还可以优化二进制文
件,以提高运行时性能,在使用指令高速缓存时尤其如此。BIT 处理使用 Sun Studio 11 或适用于 SPARC
系统的 GCC 编译器编译的二进制文件(使用 binopt=prepare 选项)。
• 简单的性能优化工具 (Simple Performance Optimization Tool, SPOT)
简单的性能优化工具 (Simple performance optimization tool, SPOT) 生成有关应用程序性能的报告。SPOT
报告中包含有关影响性能的各种常见情况的详细信息。例如,将报告由于应用程序所需数据未驻留在处
理器高速缓存中而损失的时间量。该工具的一个重要要求是应易于使用。安装后,只须键入以下命令即
可生成报告:
spot d
19- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
在此方案中,应用程序运行多次,每次生成单独的一部分报告。此外,还可以使用以下命令将 spot 附
加到现有进程:
此方法可以生成类似的报告。
SPOT 报告中包含应用程序配置文件的超级链接。通过这些配置文件,可以导航到占用时间的源代码行
(如果该信息可用的话)、反汇编的热点部分以及在反汇编内部导航。
• 自动调优和故障排除系统 (ATS)
自动调优和故障排除系统 (ATS) 是一个重新优化和重新编译二进制文件的工具,可以用于调优应用程序
并排除应用程序的故障。ATS 的工作方式是重新生成已编译的 PEC(Portable Executable Code,可移植可
执行代码)二进制文件-不需要原始的源代码。例如,使用 ATS 可以实现的操作包括:
• 查找可以实现最佳性能的编译器选项
• 查找造成运行时问题的目标文件和优化标志
• 使用新的编译器选项重新生成应用程序
• CoolThreads 优化开放源代码软件栈 (Cool Stack)
Cool Stack 是最常用的免费开放源代码应用程序的集合,已预先针对运行 Solaris 10 OS 进行优化。包含的
开放源代码应用程序包括:Apache、MySQL、Perl、PHP、Squid 和 Tomcat。特别是已生成 CSQamp 软件
包(包含 Apache、MySQL、PHP),这些应用程序本身即可实现最佳性能。
• CoolThreads 选择工具 (CoolThreads Selection Tool, cooltst)
cooltst 帮助用户评估 Sun Fire™ T1000 和 T2000 服务器对现有工作负荷的适用性。通过查看浮点密度
并确定占用大量处理器的进程来提供指导。浮点分析将查看浮点指令占指令总数的比率。如果小于 1%,
将标记为绿色;如果介于 1% 和 3% 之间,将标记为黄色;如果大于 3%,将标记为红色。即使是红色的
指示器也不会阻止在 UltraSPARC T1 处理器中执行工作负荷;但是,红色的指示是一个警告,表明所测
试的工作负荷可能会耗尽处理器的浮点资源,其他高浮点工作负荷同时执行时尤其如此。
进程分析将确定可能造成单线程瓶颈的进程/LWP。必须了解占用内核超过 20% 的任何进程/LWP 与工作
负荷功能之间的关系,因为这可能会成为 Sun Fire T2000 和 T1000 服务器中的瓶颈。在进行吞吐量计算
时,占用 CPU 资源是一种很明显的特征。当进程或线程依赖于占用大量计算资源的单个进程或线程时,
在迁移之前需要分析这一潜在的瓶颈。在线程代替等待内存的其他线程时,UltraSPARC T1 处理器的性能
最佳。
• CoolTuner
CoolTuner 是一个用于自动调优 Sun Fire T1000 或 T2000 系统的软件工具,通过应用修补程序和设置系统
参数,使系统可以实现推荐的最佳做法。该工具还可以通过 Internet 自动更新,以便利用最新的调优建议
并应用新的建议修补程序。
spot -P
20- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Sun Studio 11 编译器和工具
Sun Studio 11 软件是一组优化的编译器和工具,用于在 Sun 的硬件平台(包括最新的多核 UltraSPARC、
x64 和 x86 平台)上开发 32 位和 64 位的 C、C++ 和 Fortran 应用程序。Sun Studio 11 软件无需支付任何许可
费用即可使用;请参见 http://developers.sun.com/sunstudio/
• 性能分析器
性能分析器包括两个工具。收集器通过配置和跟踪函数调用来收集性能数据。数据可能包括调用栈、微状
态记帐信息、线程同步延迟数据、硬件计数器溢出数据、MPI 函数调用数据、内存分配数据以及操作系统
和进程的摘要信息。收集器可以为 C、C++ 和 Fortran 程序以及使用 Java 编写的配置应用程序收集所有类型
的数据。有关性能分析器的文档,请参见 http://developers.sun.com/sunstudio/analyzer_index.html
• 数据空间配置和内存对象配置是性能分析器中提供的两项功能,可以:
• 帮助开发者优化代码,并帮助管理员调优系统。
• 跨硬件和软件对 Sun 计算系统中的数据移动进行全面观察。
• 确定性能瓶颈、最大可伸缩性限制因素及其相互关系。
有关详细信息,请参见 Nicolai Kosche 的博客 http://blogs.sun.com/nk/ 以及 Sun Studio 11 中的性能分析器
文档(可以从 docs.sun.com 下载)。
• 用于在 CMT 环境中并行编程的 Sun Studio 工具。请参见 http://developers.sun.com/sunstudio/cmt.html
• OpenMP:OpenMP 是一组编译器指令、库例程和环境变量的规范,可用于在 C、C++ 和 Fortran 程序中表
示多线程共享内存并行性。OpenMP 正迅速成为并行应用程序的标准模型。程序员只需要进行相对少量的
编码工作,即可使其应用程序在共享内存多处理器系统中实现可伸缩性能。有关更多信息,请参见:
• Sun Studio 编译器和工具中的 OpenMP 支持:http://developers.sun.com/sunstudio/articles/
studio_openmp.html。
• OpenMP 介绍:用于共享内存多处理器的可移植并行编程 API:http://developers.sun.com/sunstudio/
articles/openmp/openmp_content.html。
• Lock_Lint -用于 C 语言的静态数据争用和死锁检测工具:命令行实用程序 lock_lint 分析互斥锁和
多读取器/ 单写入器锁的使用,并报告这些锁定技术使用不一致的情况,此情况可能会导致多线程应用
程序中的数据争用和死锁。请参见 http://developers.sun.com/sunstudio/articles/locklint.html
图形应用程序
GNOME 和 KDE 是 Linux 领域中最常用的两个窗口管理器。Linux 上大多数基于 X11 的图形应用程序都使
用其中一个窗口管理器所提供的开发框架生成。
在 Solaris 10 OS 中,Sun 提供了一个基于 GNOME 的增强桌面,称为 Sun Java 桌面系统 (Java Desktop System,
JDS),现在是首选的桌面。在早期版本中, Solaris OS 支持将 CDE (Common Desktop Environment,公用桌
面环境)作为缺省的窗口管理器。当然, CDE 仍与 Solaris 10 软件捆绑在一起。在 Solaris 10 平台上,用户可
以选择启用这些常用的桌面管理器之一(例如 JDS、CDE 或 KDE)。
可以使用 Sun Studio 软件开发图形应用程序。完整的 GNOME 开发工具套件可以从 获
得。GTK+ 库运行时与 Solaris 10 OS 捆绑在一起。同样,有关 KDE 开发和工具方面的帮助信息,请参见

移植与硬件无关的 GNOME 或 KDE 应用程序相对容易一些。
21- 软件开发工具Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
调试和代码优化
在任何涉及到大量代码的大型软件项目中,开发者需要使用合适的调试工具。在 Linux 端,GDB 的 GNU 调
试程序或基于该调试程序的变体是最常用的调试工具。DDD (Data Display Debugger,数据显示调试程序)
和 XDB 属于 GDB 的派生工具或扩展工具。Solaris 10 OS 为开发者提供了所有这些工具。
但是,如果需要进行更深入的分析(涉及到 Solaris OS),可能最好使用通过 Solaris 技术开发的专业工具。
Solaris 10 OS 提供系统调用跟踪工具 truss、动态跟踪 (DTrace) 以及许多其他专用的工具作为优秀的备用
工具。
Sun Studio dbx 产品通过有效地调试多线程应用程序,显著提高了程序员的工作效率,而 Sun Studio 性能分
析器提供先进的图形工具,用于评估应用程序性能并发现瓶颈和优化问题。
使用 LAMP 栈移植应用程序
Internet 的迅猛增长造成了对启用 Web 的应用程序的大量需求。大量应用程序开发者对启用 Web 的应用程
序一直使用多种技术的组合(称为 LAMP)。LAMP 代表 Linux、Apache、MySQL 和 Perl/PHP。Linux 提供
托管平台。开放源代码 Apache Web 服务器以及许多有用的扩展均提供 Web 启用技术。MySQL 是免费使用
的关系型 DBMS,为主要基于查询的数据库提供非常有效的数据存储。Perl 和 PHP 为 Web 页、动态内容和
业务逻辑提供脚本选项。
对于真正的可伸缩解决方案,这些应用程序可能需要伸缩性更好、更安全的平台(例如 Solaris 10 OS)。将
基于 LAMP 栈的应用程序迁移到 Solaris 10 平台比较容易,因为该操作系统支持所有核心组件。为 Apache、
MySQL 和 Perl 预编译的二进制文件已可以在 Solaris OS 分发中使用。针对 Solaris OS 和 UltraSPARC T1 处
理器进行优化的应用程序最新版本在 Cool Stack 中提供(请参见第19 页的“CoolThreads 优化开放源代码
软件栈 (Cool Stack)”)。每个组件的性能、安全性和调优指南也可以从各种资源(包括 Sun)获得。为了提
供更多的数据库管理系统选择, Sun 还捆绑了 PostgreSQL 作为 Solaris 10 6/06 操作系统的一部分。
有关调优的更多信息,请参阅:。有关 PostgreSQL
的更多信息,请参阅:。
Sun Studio 软件还提供一组非常高效的工具,除了支持使用这些技术开发新的应用程序和 Web 服务之外,
还用于将这些应用程序移植到 Solaris 10 OS。
内存管理
在需要实现最佳性能的产品和应用程序中,用户需要关注 OS 如何管理相对珍贵的资源(例如内存)。这就
有必要深入地了解问题(例如托管平台上的内存管理)。许多 OS 问题与大量数据和文件作为内存映射文件
进行调度、锁定和映射有关;这些问题很可能对性能造成很大影响。
因为每个操作系统版本在这些实现中隐藏了许多细节,所以最好考虑分别为每个应用程序进行与内存管理
有关的更改,并仅在性能至关重要的情况下进行更改。由于没有一种通用的方法可以确定这些策略,所以,
在大多数情况下,可能最好让应用程序在本地可用的内存管理系统中运行。
22-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 5 章
API 的差异
系统调用和库调用
Linux 和 Solaris OS 都是符合 POSIX 标准的 UNIX 系统,都提供了定义完善的系统调用接口用于访问内核工
具。无论内部实现有什么差异,两个系统上提供的系统调用接口都非常类似。按照标准的 UNIX 约定,大
多数接口函数返回 -1 来指示发生错误,并设置全局变量 errno 来提供对错误原因的完整说明。除了系统调
用之外,两个系统上还提供各种各样的函数调用。即使大多数函数调用(在两个平台上均可用时)的行为
方式类似,参数类型、返回类型和异常处理存在小的差异并不足为奇。对于只在一个平台上可用的调用,
开发者需要进行更多的工作;这些调用在移植时可能会造成更多的问题。在从 Linux 移植到 Solaris 10 OS
时,我们显然应关注那些仅在 Linux 中存在而在 Solaris 10 OS 中没有直接等效项的函数调用。
尽管有许多文献列出了 Linux 和 Solaris 操作系统 API 的差异,但是,手动跟踪这些差异可能不是最有效的
解决方案。此方法也可能是错误的。为了有效地解决由于 API 不兼容或丢失造成的问题, Sun 强烈建议使
用基于工具的方法。Sun 提供的 Sun 应用程序移植助理工具可能会有所帮助。
Sun 应用程序移植助理 (Sun Application Porting Assistant, Sun APA)
Sun 应用程序移植助理是静态源代码分析和代码扫描工具,可以用于确定 Linux 与 Solaris 平台之间不兼容
的 API。Sun 应用程序移植助理强大的 C/C++ 和 shell 脚本解析器能够以合理的准确性检查这些源代码文
件,并生成可以在移植应用程序时使用的报告。配合易于使用的 GUI 和简单的命令行界面, Sun APA 可以
简化评估和移植过程并缩短其时间。Sun APA 可以:
• 确定可能会造成潜在移植问题的系统调用。Sun APA 确定源代码中出现这些问题的总次数以及出现问题
的位置。
• 指示解决问题的难度级别,并提供详细的帮助信息来帮助您解决问题。
• 确定应用程序的大小(文件总数和代码行总数)。
• 提供直观的界面,可以快速浏览所有移植问题。
Sun APA 演示
Sun 应用程序移植助理是基于 Java 技术的软件,可以在任何支持 Java 运行时环境的平台(包括 Solaris、
Linux 和 Windows)上运行。该工具可以提供命令行界面和图形用户界面。Sun APA GUI 设计的界面很简
单,可以快速扫描需要移植的应用程序,并浏览可以帮助移植应用程序的所有信息。
23-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
命令行界面
表8 中列出了 SunAPA 命令可用的命令行选项:
表8. SunAPA 命令的命令行选项
需要指定所有命令选项。确定移植问题的报告存储在 -r 选项指定的目录中。
图形用户界面
可以通过在命令提示符下键入没有任何命令选项的 SunAPA 命令,调用该工具的 GUI 版本。在 SunAPA
中,需要创建一个项目。可以通过单击 "File->Create Project" (文件-> 创建项目)创建项目,然后,您将
看到以下项目创建向导屏幕。输入项目的名称、源平台以及希望将报告存储到的目录。然后,单击 "Next"
(下一步)。
选项名称说明
-p file 项目的名称。
-s file 源平台的名称。
-r dir 存储生成的报告的输出目录。
-d dir 包含源代码的根目录的路径。
24-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
在下一个屏幕上,需要指定要移植的应用程序的根目录。在指定了应用程序的根目录之后,可以创建项目。
创建项目之后,将显示 Sun APA GUI 主屏幕。此屏幕的各个区域如下所示。
25-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
1. 树窗格区域包含 "Files" (文件)和 "Issues" (问题)两个选项。单击 "Files" (文件)选项卡可以显示源
代码树。然后,用户可以浏览源代码树。单击某个文件名将在源代码视图窗格 (3) 中显示该文件。可用
的第二个选项卡是 "Issues" (问题)选项卡。此选项卡显示问题树,包括问题名称以及每个问题在源代
码中出现的所有位置。单击发生问题的节点将调出源代码,并在源代码中突出显示该问题。
2. 报告浏览器窗格显示为源代码生成的所有报告。通过在每个报告窗格上单击 "Generate Report" (生成报
告)软盘图标,可以多次生成报告。也可以单击 "Save Report" (保存报告)右箭头图标将报告保存到文
件。报告可以保存为文本、HTML、XML 或 StarSuite™ 软件格式。缺省情况下, Sun APA 不会保存任
何报告,需要通过单击 "Save Report" (保存报告)图标显式保存报告。Sun APA 生成的报告包括:
• 文件类型报告
• 按问题名称列出的问题摘要报告
• 按权重列出的问题摘要报告
• 问题详细信息报告
• Xref 报告
有关每种报告类型的说明,请参见下列各节。
3. 源代码视图窗格显示源代码以及一些超级链接。超级链接指向源代码中的函数调用和方法调用。将突出
显示确定为潜在问题的函数调用。
该工具还提供帮助解决移植问题的详细信息。上面的屏幕快照显示名为 "poll" 的问题的帮助示例。在 GUI
主窗口中显示的问题树中右键单击问题名称后,将显示此对话框。
26-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
Sun APA 报告
文件类型报告
Filetype (文件类型)报告提供有关要移植的应用程序的大小方面的信息(表9)。此报告有助于估计移植
源代码所需的工作量。文件类型报告示例如下所示。Sun APA 只显示可以解析的文件类型的代码大小。目
前只限于 C、C++、头文件、Shell 脚本和 Java 软件源代码文件。该报告以代码行总数以及文件总数显示大
小。Sun APA 显示的代码行数不包括注释行和空白行。
表9. 文件类型摘要报告示例
问题摘要报告
Issue Summary (问题摘要)报告提供有关移植问题的摘要信息(表10)。报告列出每个问题以及问题名
称、该问题的相对权重以及发生的总次数。权重是一个整数值,指示解决问题的难度级别。例如,权重为 5
的问题通常采用一种比较简单的解决方案即可,很可能通过搜索和替换操作或以批处理模式运行一下简单
脚本便可解决。权重为 200 的问题通常指示某个 API 在 Solaris 平台上不可用,需要为 Solaris 重新编写。另
外一定要注意, Sun APA 报告的问题并非全部是实际问题。有些问题可能是误报或潜在的问题。因此,评
估每个问题的源代码上下文非常重要。
表10. 问题摘要报告示例
文件类型代码行数文件总数
未知0 353
c++ 162086 253
make 0 2
h 53519 259
c 459 4
python 0 6
sh 115 3
perl 0 4
总计216179 884
组问题名称发生次数权重
linuxs10.ref accept 11 5
connect 743 5
gettimeofday 23 1
poll 1 5
program_invocation_name 6 200
clearenv 3 200
总计:6 发生次数:787
27-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
根据解决相应问题所需的解决方案类型为每个问题分配权重。表11 列出了 Sun APA 中所有权重和对应的问
题类型。通常,权重范围在 1-25 之间采用简单的解决方案,权重范围在 25 以上到 200 之间采用比较复杂的
解决方案。
表11. 为不同问题类型分配的权重
问题详细信息报告
Issue Detail (问题详细信息)报告是摘要报告的详细信息版本,详细提供存在问题的所有源代码文件以及
源代码中出现该问题的位置(表12)。报告列出存在移植问题的文件名、问题名称以及源代码中出现该移
植问题的行号。
表12. 问题详细信息报告示例
权重问题类型
1
• 如果函数调用参数属于不同的数据类型
• 如果函数调用可以在其他库中使用,并且可以通过与其他库链接进行解析
• 如果需要包含任何其他/ 不同的头文件
5
• 如果函数调用不能在 Solaris 上使用,但是可以使用等效的替代项
• 如果函数调用在 Solaris 10 上设置不同的错误条件
• 如果函数调用参数的个数不同
• 如果函数返回类型不同
10 • 如果函数调用所属软件包的源代码可供 Solaris 10 作为开放源代码使用
25 • 如果 Linux 和 Solaris 10 之间定义的结构定义不同
• 有时,还分配给需要简单包装实现的函数调用
100 • 如果函数调用不能在 Solaris 10 OS 上使用,并且实现很简单
200 • 如果函数调用不能在 Solaris 10 OS 上使用,并且实现很复杂
组文件问题名称行号
linuxs10.ref showCustomer.cpp connect 118
connect 122
connect 126
Profiler.C gettimeofday 123
gettimeofday 135
gettimeofday 150
makelist.cpp program_invocation_name 28
program_invocation_name 47
28-API 的差异Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
权重报告
Weight (权重)报告与问题摘要报告相同,按问题权重分组显示摘要。此报告关注的是源代码中出现的问
题类型(表13)。
表13. 权重报告示例
移植过程
组合使用 Sun APA 工具和目标编译器可以实现应用程序的最终移植。将应用程序移植到 Solaris 的建议过程
如下:
1. 在原始平台上获取完整应用程序的干净版本。获取生成日志供参考。收集所有环境变量和第三方软件依
赖项的有关信息。
2. 将源代码重定位到 Sun Solaris OS 开发环境。执行初始代码清理,以删除任何冗余的文件(例如重复的
目录和二进制文件)。
3. 使用 Sun APA 执行源代码分析,以确定移植问题和完整性。分析源文件、makefile、shell 脚本,并获取
源代码大小(按文件类型列出)、丢失的头文件和潜在的移植问题的有关信息。
4. 执行 Sun APA 标识的源代码转换。此过程涉及手动编辑源代码、编写 Solaris 上缺少的 API 包装函数等
操作。
5. 安装第三方软件(如果需要)。
6. 将生成环境移植到 Solaris OS 环境(如果需要)。
7. 在 Solaris OS 平台上生成完整的应用程序,以解决任何编译器问题。
8. 根据需要执行单元测试、集成测试和系统测试。
组权重问题发生次数
linuxs10.ref 200 program_invocation_name 6
clearenv 3
总计2 9
5 connect 743
poll 1
accept 11
总计3 755
1 gettimeofday 23
总计1 23
29- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
第 6 章
结论
本指南用于帮助开发者成功地将 Linux 上运行的应用程序迁移到 Solaris 10 OS。我们已比较并对比了两种平
台上的 OS 功能、体系结构差异、API 和开发环境等。这些信息可以帮助开发者顺利地规划和执行从 Linux
向 Solaris OS 的迁移。
致谢
Harry Foxwell、Sandeep Kamat 和 Shanti Subramanym 对本文档进行了审校, Sun 对他们表示由衷的感谢。
参考资料
下列资源可能会对您有所帮助。
• 《In a Class By Itself — The Solaris 10 Operating System》。此信息性简明白皮书介绍了 Solaris 10 OS 的各项
功能,详请参见:。
• OpenSolaris Web 站点,包括 Solaris OS 的全部源代码:。
• Solaris 的免费软件。可以为所有版本的 Solaris 平台下载最新的更新程序:。
• Solaris 10 Software Developer Collection 中的《Solaris(64 位)开发者指南》。Sun 为在 Solaris OS 上开发
64 位应用程序提供的指南:。
• 由 Jim Mauro 和 Richard McDougall 合著的《Solaris Internals》,Sun Microsystems Press 出版。讨论 Solaris
线程和 Solaris 内部实现;是有关 Solaris OS 的一本不错的参考资料,但是此版本有些过时。
• 由 Steve Kleiman、Devang Shah 和 Bart Smaalders 合著的《Programming With Threads》, SunSoft Press 出
版。这是一本有关多线程编程和应用程序开发(尤其对于 Solaris OS)方面的优秀书籍。
• Sun 开发者网络站点上的 Sun Studio 中心。提供有关 Sun Studio 编译器和工具的完整详细信息,包括全部
文档、技术文章和用户论坛:http://developers.sun.com/sunstudio/
• 由 Andrew Koenig 编著的《C Traps and Pit Falls》, Addison-Wesley 出版。本书对编写可移植程序非常
有用。
• 有关 Red Hat Linux 的信息,请访问:。
30- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 A
编译器选项
有关 Sun Studio 11 C 编译器选项的详细信息,请参见 上的用户指南。
要获得完整的 Sun Studio 11 产品文档,请访问:http://developers.sun.com/prodtech/cc/documentation/ss11/
index.html。
Linux GCC 选项Sun Studio C
编译器选项
说明
-v -#, -V 在 gcc 中, -v 显示编译器的版本信息。在 Sun Studio C 编译
器中, -# 启用详细模式,显示命令选项如何扩展并显示调用
时的每个组件。-V 选项提供编译器的版本信息。
--help -v -flags, -xhelp 输出可用选项的摘要。在使用 gcc 时,使用 --help -v 选项
可以获得所有可用编译器的摘要,包括 C++ 编译器、基于 Java
技术的编译器、Fortran 编译器以及其他编译器(如果这些编译
器可用的话)。
-### 显示调用时的每个组件,但是并不真正执行。同时还显示命令
选项如何扩展。
-p/-profile -P (大写 P) -p(小写 p) -P (大写 P)准备用于收集配置数据的目标代码。-p (小写
P)通过预处理程序运行源代码文件。
-mcpu=i386/ -
march=i386
-x386 针对 80386 处理器进行优化。现在已过时。使用
-xchip=generic 代替。
-mcpu=i486/ -
march=i486
-x486 针对 80486 处理器进行优化。现在已过时。使用
-xchip=generic 代替。
-fPIC -fpic -KPIC -Kpic 生成与位置无关的代码。-Kpic 和 -KPIC 在 x86/x64 下是相
同的。对于 SPARC 平台, -KPIC 和 -kpic 已过时。现在,
对 -KPIC 应使用 -xcode = pic32,对 -Kpic 应使用
-xcode = pic13。
-O -fast 选择最佳的编译选项组合,以加快可执行代码的速度。
-xalias_level 使编译器可以执行基于类型的别名分析和优化。
-xbuiltin 改善调用标准库函数的代码的优化。
-xcrossfile 启用跨源代码文件的优化和内联。gcc 中没有等效的选项。
-ffunctionsections,
-fdata-sections
-xF[=[no%]func,
[no%]gbldata, %
all,%none]
启用函数和变量的最佳重新排序,方法是将函数和/ 或数据放
入单独的片断,以便由链接程序进一步重新排序。
-fno-inline
-finlinefunctions
-xinline= {list...} 尝试只内联指定的函数。gcc 中没有完全等效的选项。不过,
在 gcc 中可以使用 -finline-functions 和 -finlinelimit=
N 控制内联。
-xipo 通过调用过程间分析组件来执行整个程序的优化。
-ffast-math -xlibmil 内联一些库例程,以加快执行速度。
-xlic_lib=sunperf Sun 提供的性能库中的链接。
-xmaxopt=off,1,
2,3,4,5
此命令将 #pragma opt 级别限制在指定的级别。缺省值是
-xmaxopt=off,将忽略 pragmaopt。
31- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
缺省选项-xnolibmil 不内联数学库例程。此选项是 gcc 缺省选项。
-O1/-O2/-O3 -x01 至 -x05 递增的优化级别。
-xprefetch 启用 prefetch 指令。依赖项。对于
-xprefetch=yes,使用 -xprefetch=auto, explicit
代替。对于 -xprefetch=no,使用
-xprefetch=no%auto,no%explicit 代替。
-xprefetch_level 控制 -xprefetch=auto 设置的自动插入 prefetch 指令的
主动性。
-
fprofile-generat
e, -fprofile-use
-xprofile=
[collect|use]
生成用于收集配置信息的代码。此选项以后可供配置工具使用。
-xsafe 允许编译器假定不会出现任何基于内存的陷阱。gcc 中没有等
效的选项。
-Os -xspace 对增大代码大小的循环不进行任何优化或并行化。
-funroll-loops/
-funroll-allloops,
--param
max-unrolltimes=
N
-xunroll=n 向优化器建议展开循环 n 次。
-xchar_byte_order 通过按指定字节顺序放置多字符型字符常量中的字符来生成整
型常数。
隐式-xmemalign 指定未对齐的数据访问假定的最大内存对齐和行为。
-fnonstd 对浮点运算硬件执行非标准初始化。gcc 中没有等效的选项。
-fns 对基于 SPARC 处理器的计算机启用非标准的浮点模式。
-fprecision 初始化浮点控制字中的舍入精度模式位。
-fround 设置程序初始化期间在运行时建立的 IEEE 754 舍入模式。此选
项是 gcc 中的缺省选项,不能设置为其他值。
-ffast-math -fsimple 允许优化器简化与浮点运算有关的假定。
-fsingle 使编译器以单精度形式(而不是双精度形式)计算浮点表达
式。gcc 中没有等效的选项。
-ffloat-store -fstore 使编译器将浮点表达式或函数的值转换为赋值语句左侧的类
型。也可以在 x86 上使用。
-ftrap 设置在启动时生效的 IEEE 754 捕获模式。gcc 中没有等效的
选项。
-nofstore 不将浮点表达式或函数的值转换为赋值语句左侧的类型。gcc
中没有等效的选项。也可以在 x86 上使用。
缺省选项-xlibmieee 强制对异常情况的算术例程返回 IEEE 754 样式的值。
-fsingleprecisionconstant
-xsfpconst 以单精度形式表示无后缀的浮点数常量。
-xvector 启用向量库函数调用的自动生成。
Linux GCC 选项Sun Studio C
编译器选项
说明
32- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
-threads 多线程使
用 Solaris 线程
-pthreads 多线程
使用 POSIX 线程
-mt 扩展到 -D_REENTRANT -lthread 的宏选项。
-ftlsmodel=
MODEL
-xthreadvar
[=dynamic|no% dynamic]
指定此选项可以控制线程本地变量的实现。
-xautopar 启用多处理器的自动并行化。gcc 中没有等效的选项。
-fstack-check -xcheck 增加对栈溢出的运行时检查。
-xdepend[=yes| no] 分析循环的迭代间数据依赖性并重新构造循环。gcc 中没有等
效的选项。
-xexplicitpar (仅适用于 SPARC。)基于 #pragma MP 指令的规范生成并行
代码。gcc 中没有等效的选项。
-xloopinfo 显示哪些循环并行化,哪些循环不并行化。gcc 中没有等效的
选项。
-xopenmp 支持用于显式并行化的 OpenMP 接口,包括一组源代码指令、
运行时库例程和环境变量。
-xparallel 对于 x86/x64,自动并行化循环。对于 SPARC,由编译器自动
并行化和程序员显式指定并行化。
-xreduction 在自动并行化期间启用归约识别。gcc 中没有等效的选项。
-xrestrict 将指针值函数参数视为受限指针。gcc 通过 -fargumentnoalias
和 -fargument-noalias-global 部分支持此选
项。此外,受限指针通常在 gcc 中与代码中的
__restrict__ 说明符一起使用。
-xvpara 警告循环已指定了 #pragma MP 指令,但指定的指令可能不适
合并行化。gcc 不支持此选项。
-Zll 为 lock_lint 工具创建程序数据库,但不生成可执行代码。
gcc 不支持此选项。
-A name=tokens -Aname [(tokens)] 将 name 作为谓词与指定的 tokens 关联(就好像通过
#assert 预处理指令关联)。
-C -C 禁止预处理程序删除注释(预处理指令行上的注释除外)。
-D name[=tokens] -Dname[=tokens] 将 name 与指定的 tokens 关联(就好像通过 #define 预处理
指令关联)。
-E -E 只通过预处理程序运行源代码文件并将输出发送到 stdout。
-Wstrictprototypes
-fd 报告 K&R 样式的函数定义和声明。
-M/-MM -H 将当前编译期间涉及的每个文件的路径名输出到标准错误中,
每行输出一个路径名。
-I -I 对于具有相对文件名的 #include 文件,将目录添加到所搜索
的列表中。
-EP -P 只通过 C 预处理程序运行源代码文件。然后,将输出放入后缀
为 .i 的文件。与 -E 不同,不包括行号信息。在 gcc 中,
-EP 禁止生成行号,而是输出到 stdout。
-U name -Uname 删除预处理程序符号 name 的任何初始定义。
Linux GCC 选项Sun Studio C
编译器选项
说明
33- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
-xCC 接受 C++ 样式的注释。缺省情况下, gcc 接受 C++ 样式的注
释,但是可以使用 -std 禁止接受此类注释。
-std=c99 -xc99 控制编译器对受支持的 C99 功能的识别。
-funsigned-char,
-fsigned-char
-xchar[=signed|
unsigned]
帮助从将字符型数据定义为无符号数据的系统迁移。
-finputcharset=
CHARSET
-xcsi 允许 C 编译器接受以不符合 ISO C 源代码字符代码要求的语言
环境 (locale) 编写的源代码。
-fexeccharset=
UTF-16
-xustr=
{ascii_utf16_sh
ort|no}
此选项允许编译器识别国际化应用程序中的 ISO10646 UTF-16
字符串文字。
-M -xM 只在指定的 C 程序上运行预处理程序,请求其生成 makefile
依赖项并将结果发送到标准输出。
-MM -xM1 收集依赖项(例如 -xM),但排除 /usr/include 文件。
-aux-info
FILENAME
(不完全等效)
-xP 输出在此模块中定义的所有 K&R C 函数的原型。gcc 选项
-aux-info 并非完全等效,但是会输出转换单元中的所有函
数的原型声明。
-pg -xpg 使用 gprof(1) 准备用于收集配置数据的目标代码。
-xsb 为源代码浏览器生成额外的符号表信息。gcc 中没有等效的
选项。
-xsbfast 为源代码浏览器创建数据库。gcc 中没有等效的选项。
-trigraphs -xtrigraphs [=yes|no] 确定对三字母序列的识别。在 gcc 中,-trigraphs 等效于
-xtrigraphs=yes。
-c -c 指示编译器禁止使用 ld(1) 链接,并为每个源代码文件生成 .o
文件。
-o -o 为输出文件命名。
-S -S 指示编译器生成汇编源代码文件,但是不汇编程序。
-W 将参数传递给 C 编译系统的组件。两个编译器可能都不支持该
组件。
-pedantic -X -X 选项指定符合 ISO C 标准的不同程度。在 gcc 中,
-pedantic 选项几乎与此选项完全相同。
TMPDIR 环境变量 -xtemp=dir, TMPDIR
环境变量
将 cc 使用的临时文件的目录设置为 dir。对于 gcc,应设置环
境变量 TMPDIR。
-Q -xtime 报告每个编译组件所使用的时间和资源。
-B -Y 为 C 编译系统组件的位置指定一个新目录。
组合 -nostdinc 和
-idirafter DIR
-YA 更改搜索组件的缺省目录。
-YI 更改搜索 include 文件的缺省目录。
-YP 更改查找库文件的缺省目录。
-YS 更改启动目标文件的缺省目录。
-errfmt 为错误消息加上 error: 字符串作为前缀,以便与警告消息
区分。
Linux GCC 选项Sun Studio C
编译器选项
说明
34- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
-w -w, -erroff 禁止显示编译器警告消息。
-errshort 控制编译器在发现类型不匹配时生成的错误消息的详细程度。
-errtags 显示每条警告消息的消息标记。gcc 中没有等效的选项。
-Werrors -errwarn 如果发出所指定的警告消息, cc 将以失败状态退出。
-Wall -v 指示编译器执行更严格的语义检查并启用其他类似于 lint 的
检查。
-fsyntax-only -xe 只对源代码文件执行语法和语义检查,但是不生成任何目标代
码或可执行代码。
-xtransition 对 K&R C 与 Sun ISO C 之间的差异发出警告。gcc 中没有等
效的选项,但是在违反 ISO C 规则时会发出警告。
-g -g 为调试程序生成其他符号表信息。
-WI, -s -s 从输出目标文件中删除所有符号调试信息。
-xs 允许在没有目标 (.o) 文件的情况下进行调试。
-static -B 指定用于链接的库绑定是静态的还是动态的。缺省情况下是动
态的。
隐式-d 指定链接编辑器中是动态链接还是静态链接。
-shared -G 将该选项传递给链接编辑器后,将生成共享对象,而不是生成
动态链接的可执行代码。
-WI, name -h name 为共享动态库指定一个名称,以便拥有不同版本的库。
-i 将该选项传递给链接程序后,将忽略任何 LD_LIBRARY_PATH
设置。
-L -L 将目录添加到链接程序搜索库的列表中。
-l -l 与对象库 libname.so 或 libname.a 链接。
-mc 删除目标文件的 .comment 部分的重复字符串。
-mr 删除 .comment 部分的所有字符串。还可以在目标文件的此部
分插入 string。gcc 中没有等效的选项。
-Q 向输出文件发出还是不发出标识信息。
-Wl,-rpath -R 将用于指定库搜索目录的冒号分隔目录列表传递给运行时链接
程序。
-xMerge 将数据段合并到文本段中。
-xcode 指定代码地址空间。
缺省选项-xstrconst 将字符串文字插入文本段(而不是缺省数据段)的只读数据部
分。缺省情况下, gcc 中会发生此情况。在 gcc 中,可以使
用 -fwritable-strings 添加字符串的可写副本。
-xildoff 禁用增量链接程序并强制使用 ld。gcc 中没有等效的选项。
-xildon 启用增量链接程序并强制以增量模式使用 ild。gcc 中没有等
效的选项。
-xnativeconnect 在目标文件以及后续的共享库中包含接口信息,以便可以从
Java 代码中调用共享库。
Linux GCC 选项Sun Studio C
编译器选项
说明
35- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
-gstabs,
-gdwarf-2
-xdebugformat=
[stabs|dwarf]
设置调试信息的格式。
-nostdlib -xnolib 缺省情况下不链接任何库。
-march -xarch 指定指令集体系结构。
-xcache 定义供优化器使用的高速缓存属性。gcc 中没有等效的选项。
-xcg 指定 -xarch、-xchip 和 -xcache 的值。依赖项。使用 -O
代替,以利用 -xarch、-xchip 和 -xcache 的缺省值。
SPARC:-
mcpu=NAME x86:
-march=NAME
-xchip 指定供优化器使用的目标处理器。
-ffixed/
-fcall-used-
/-fcallsaved-<
reg>
-xregs 指定所生成代码的寄存器使用情况。在 gcc 中,可以使用所示
的三个选项之一来指定寄存器。
-b -xtarget 指定指令集和优化的目标系统。已过时。对于
-xtarget=386、xtarget=486,使用
-xtarget=generic 代替。
-xpch={auto|
autofirst..}
此编译器选项将激活预编译头功能。编译器自动维护预编译头
文件。gcc 也支持预编译头,但是要求显式编译这些头,就像
您编译 C 程序文件一样。无法自动生成预编译头。
使用平台特定的多媒
体和流指令。Intel 和
AMD 处理器系列:
-mmx, -msse,
-msse2, -msse3,
-m3dnow SPARC 处
理器系列: -mvis
使用平台特定的多媒体和流指
令。Intel 和 AMD 处理器系
列:-xarch=sse,
-xarch=sse2 SPARC 处理
器系列:-xvis
这些选项启用专门优化的多媒体和流指令,这些指令是 ISA 特
有的。
-save-temps -keeptmp 不删除临时文件。
-malign-double -dalign 使用双字加载指令和存储汇编指令。这个 SPARC 技术特有的
选项针对 SPARC 指令集定制。已过时。使用
-xmemalign=8s 代替。
-mcmodel -xmodel= 仅适用于 x64,在 -xarch=amd64/amd64a 下。支持基于大
小的不同数据访问方案。 可能是 medium、small 或
kernel。
-fomit-framepointer
-xregs=frameptr 允许使用帧指针寄存器(在 x86 上是 %ebp,在 x64 上是
%rbp)作为被调用方保存的未分配寄存器。
< 无> -xthreadvar 控制线程本地变量的实现。
Linux GCC 选项Sun Studio C
编译器选项
说明
36- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 B
链接程序选项
gld 选项Solaris 链接程序选项说明
-static -a 仅在静态模式下,生成可执行目标文件;针对未定义的引用发
出错误。这是静态模式的缺省行为。
-b 仅在动态模式下,对引用共享对象中的符号的重定位不进行任
何特殊处理。若不使用 -b 选项,链接编辑器会为对共享对象
中定义的函数的引用创建与位置无关的特殊重定位。
-B direct 通过记录每个符号引用与提供定义的依赖项之间的关系来设置
直接绑定信息。
-B dynamic | static 控制库包含的选项。如果指定了 -B static 选项,则在出现
-B dynamic 之前,不会接受任何共享对象。
-B eliminate 从符号表中删除未分配给任何版本定义的所有符号。GNU 链接
程序中没有等效的选项。
-B group 将共享对象及其依赖项设置为一个组。GNU 链接程序中没有等
效的选项。
-B local 使未分配给版本定义的全局符号降为本地符号。GNU 链接程序
在版本定义文件中使用通配符匹配可以实现此目的。
-B reduce 在生成可重定位对象时,根据版本规范缩减符号信息。GNU 链
接程序中没有等效的选项。
-symbolic -B symbolic 仅在动态模式下使用。在生成共享对象时,此选项将全局符号
引用绑定到该对象中的相应定义上(如果可用)。
-c -c name 记录配置文件名称,以便在运行时使用。
-d y | n 指定是动态链接还是静态链接:y 代表“是”,n 代表“否”。
-D token [,token] 输出标记所指定的调试信息。GNU 链接程序中没有等效的
选项。
-f name -f name 仅对于共享对象,指定将共享对象的符号表作为 name 所指定
的共享对象的符号表上的辅助过滤器。
-soname name -h
name
-h name 仅在动态模式下,在生成共享对象时,此选项记录对象的动态
部分的 name。对于 GNU 链接程序,必须使用选项 -soname。
-shared -G 生成共享对象。
-i 忽略 LD_LIBRARY_PATH 环境变量。GNU 链接程序中没有等
效的选项。
--dynamic-linker name -I name 在生成可执行文件时,使用 name 作为要写入程序头的解释程
序的路径名。GNU 链接程序中没有等效的选项。
-L path -L path 将路径添加到库搜索目录中。
(-M) -m 在标准输出上生成输入部分和输出部分的内存映射或列表以及
任何非致命的多重定义符号。
--version-script
mapfile -M mapfile 将 mapfile 作为指令文本文件读取到 ld。
37- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
-N string 此选项使 DT_NEEDED 项添加到所生成的对象的 .dynamic
部分。GNU 链接程序中没有等效的选项。
-p 标识用于在运行时审计对象的审计库。GNU 链接程序中没有等
效的选项。
-r 将可重定位目标文件组合在一起,生成一个可重定位目标文
件。GNU 链接程序中没有等效的选项。
-rpath -R path -R path 为运行时链接程序指定以冒号分隔的搜索目录列表。在 GNU
链接程序中, -rpath 和 -R path 的含义相同。
-S/-s -s 从输出文件中剥离符号信息。任何调试信息(即 .debug、
.line 和 .stab 部分及其关联的重定位项)均将被删除。
-t -t 禁用对大小不同的多重定义符号的警告。GNU 链接程序中的
-t 表示在链接程序处理文件时输出文件名。
-WI,
-whole-archive/
--no-whole-archive
-z allextract/-z
defaultextrac t /-z
weakextract
更改归档的提取标准。
-z absexec 指定应立即解析对外部绝对符号的引用,而不应留待运行时进
行解析。GNU 链接程序中没有等效的选项。
-z combreloc 组合多个重定位部分。GNU 链接程序中没有等效的选项。
-z endfiltee 标记 filtee,以便在过滤器处理时,终止过滤器执行的任何
进一步的 filtee 搜索。GNU 链接程序中没有等效的选项。
-z ignore | record 忽略(或记录)未作为链接编辑一部分引用的动态依赖项。
GNU 链接程序中没有等效的选项。
-z lazyload/
-z nolazyload
分别启用或禁用动态依赖项的延迟装载。GNU 链接程序中没有
等效的选项。
-z muldefs 允许多个符号定义。GNU 链接程序中没有等效的选项。
-z nodefs 允许未定义的符号。生成共享对象时,此选项是缺省选项。
GNU 链接程序中没有等效的选项。
-z redlocsym 从 SHT_SYMTAB 符号表中删除所有本地符号(SECT 符号除
外)。GNU 链接程序中没有等效的选项。
gld 选项Solaris 链接程序选项说明
38- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 C
兼容的 #pragmas
注意:所有属性均使用以下格式在 gcc 中声明:
attribute-name 可以是下列属性之一。
变量的属性
aligned (alignmode)
指定变量的最小对齐(以字节为单位)。示例:
对于 Sun Studio 编译器,可以使用以下命令实现:
packed
指定结构将采用可能的最小对齐。使用 aligned 属性可以指定较大的值。对于 Sun Studio 编译器,可以使
用以下命令实现:
section
指定变量位于特定的 section-name 部分,而不是缺省的部分(例如 data 和 bss)。Sun Studio 编译器
中没有等效的声明。
unused
用于向 gcc 表明可能不使用该变量。gcc 不会生成警告。Sun Studio 编译器中没有等效的声明。
type _attribute_ (())
int x _attribute_ ((aligned (16))) = 0;
#pragma align integer (variable[,variable])
#pragma pack(n)
section ("section-name")
39- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
函数的属性
noinline 和 always-inline
控制函数的内联。noinline 禁止将函数视为内联函数, always-inline 内联声明为内联函数的函数
(即使未指定任何优化)。
对于 Sun Studio 编译器,可以使用以下命令将函数声明为内联函数和非内联函数:
Sun Studio 编译器只允许全局内联控制。
constructor
使 gcc 在调用 main() 之前调用函数。Sun Studio 编译器中的等效声明为:
destructor
使 gcc 在调用 main() 之后调用此函数。类型应为 void,并且不接受任何参数。Sun Studio 编译器中的等
效声明为:
pure
此选项可以如下所示在 gcc 中使用:
此命令通知 gcc 函数安全调用的次数要少于程序声明的次数。依赖于易失性存储器或其他系统资源的函数
可能不会声明为 pure。
Sun Studio 编译器中没有等效的声明。但是,可以使用以下命令部分实现此声明:
此命令声明函数没有任何负面影响。
#pragma [no_]inline (funcname[, funcname])
#pragma init (f1[, f2...,fn])
#pragma fini (f1[, f2...,fn])
int memcmp (const void *, const void *, size_t ) _attribute_ ((pure));
#pragma no_side_effect (funcname);
40- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
extern int old_extname (int) _asm_ ("new_extname");
使 gcc 可以将名为 old_extname 的每个外部定义替换为 new_extname。因此,链接程序在链接时只能
看到 new_extname。对于 Sun Studio 编译器,可以使用以下命令实现此目的:
#ident string
将 string 放入可执行代码的 .comment 部分。对于 Sun Studio 编译器,可以使用以下命令实现此目的:
weak
使声明定义为弱符号,而不是定义为全局符号。对于 Sun Studio 编译器,可以使用以下命令实现此目的:
有用的 Sun Studio 编译器选项(在 gcc 上不可用)
#pragma opt level (funcname[,funcname])
级别值指定 funcname 子程序的优化级别。可以指定可选级别 0、1、2、3、4 和 5。可以通过将级别
设置为 0 禁用优化。必须在 pragma 之前设计 funcname 子程序的原型。
#pragma rarely_called (funcname[,funcname])
此 pragma 向编译器后端发出一条提示,表明很少调用指定的函数。这样,编译器可以在此类例程的调用点
上执行配置文件反馈样式的优化,而没有配置文件收集阶段的开销。由于此 pragma 选项是建议选项,所以
编译器优化器可能不基于此选项执行任何优化。
#pragma returns_new_memory (funcname[,funcname])
此 pragma 断言指定函数的返回值与调用点上的任何内存位置都不重名。实际上,此调用返回新的内存位
置。此信息使优化器可以更好地跟踪指针值并确定内存位置。这样可以改善循环的调度、管道传输和并行
化。但是,如果断言是假的,则该程序的行为未定义。
#pragma unroll (unroll_factor)
此 pragma 的参数 unroll_factor 接受正整数常数值。此选项应用于当前块中的下一个 for 循环。如果展
开因子不是 1,此指令将向编译器发出建议,表明应按给定的因子展开指定的循环。编译器将使用该展开
因子(如果可能)。
展开因子值是 1 时,此指令将作为一个命令使用,向编译器表明不会展开循环。编译器在 3 或更高的优化
级别利用此信息。
#pragma redefine_extname old_extname new_extname
#pragma ident string
#pragma weak name
41- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 D
内联汇编
Sun Studio 软件在处理内联汇编时采用不同的机制,该机制基于 .il 内联模板文件和 __asm("string")
关键字。在内联模板文件中,用户可以采用以下格式编写模板:
传递的参数和返回值基于底层体系结构的调用约定。编译器可能会优化提供的代码,以提高性能。有关详
细信息,请参阅 inline 手册页。
Gcc 采用扩展的内联汇编机制,声明输入操作数和输出操作数,但是不进行优化。
.inline ,0

.end
42- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 E
Make 选项
Linux GNU Make Solaris OS Make 说明
-C dir, -
directory=dir
在读取 makefile 之前转到目录 dir。如果指定了多个 -C 选
项,则每个选项相对于前一个选项进行解释:-C / -C usr
等效于 -C /usr。Solaris OS 中没有等效的选项。
-d, --debug -d, -dd 输出调试信息。
-e, -environment
overrides
-e 环境变量覆盖 makefile 中的赋值。
-f file -f file 使用 file 作为 makefile。
-h, --help 显示帮助信息。Solaris OS 中没有等效的选项。
-i -i 忽略对 remake 文件所执行的命令中的错误。
-I DIR 在目录 DIR 中搜索包含的 makefile。Solaris OS 中没有等效
的选项。
-k -k 在当前目标上出错时,继续执行其他依赖项分支。
-n -n 不真正运行命令;只是输出命令。
-p -p 输出一组完整的宏定义和目标说明。
-q -q 问题模式。退出状态指定目标文件是否是最新的。
-r -r 不读入隐式 rules 文件。
-R 禁用内置变量设置。Solaris OS 中没有等效的选项。
-s -s 无提示模式。不回显命令。
-S -S 取消 -k 选项的作用,在命令返回非零的退出状态时停止处
理。
-t -t 处理目标文件,而不是重新生成目标文件。
-w 输出当前目录。Solaris OS 中没有等效的选项。
-W file 假定刚修改了目标文件。等效于使用 touch。
43- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 F
RCS、SCCS 和 CVS 的对应关系
RCS 命令SCCS 命令CVS 命令说明
ci file sccs admin -i
-nfile file
cvs add filename cvs
commit filename [1]
初次检入文件并创建修订历史记录文件。
co file sccs get file cvs -r checkout
file
检出文件,以便进行读取。
co -l file sccs edit file cvs checkout file 检出文件,以便进行编辑。
ci file sccs delta file 检入以前锁定的文件。
ident file what file 输出关键字信息。
rlog file sccs prs file cvs history
[-report]
[-flags]
[-options args]
[files...]
输出文件历史记录。
rcsdiff -rx -ry
file
sccs sccsdiff
-rx -ry file
比较两个修订版。
rcsdiff file sccs diffs file cvs diff [-lR]
[format_opti ons]
[[-r rev1 | -D
date1] [-r rev2 |
-D date2]]
[files...]
将当前修订版与最新修订版进行比较。
rcsmerge -rx-y
file
sccs edit -ix-y
file
将两个版本之间的更改合并到文件中。
rcs -l file 锁定最新的修订版。
44- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
附录 G
建议的方法
应用程序迁移项目通常分阶段执行。图2 显示了包含大量代码行和数据的此类项目常见的主要阶段。
图2. 应用程序迁移项目常见的阶段
移植评估
此阶段非常重要。开始之前,应准备 Linux 上的应用程序的所有部分的清单。这有助于整体了解系统。基
于这些研究以及整体系统的设计,将确定对与平台有关的功能的依赖性。将这些信息与 Solaris 平台上可能
发现的变体进行比较,制定出合适的策略,以使移植过程尽可能高效。然后确定工具(如果有)。Sun 应用
程序移植助理和 JScore 之类的工具可能会有帮助。从管理的角度,在工作开始之前,可能需要合理地估计
工作量。考虑项目里程碑和建议的最后实现期限,也会带来很多方便。
模块级移植
这是在代码中执行实际更改的阶段。可以通过将项目适当地拆分为更小的单元来执行此项任务。通常,这
些单元称为模块。正常情况下,每个模块采用的方法包含五个阶段。下面将介绍这些阶段:
1. 评估:在此阶段中,基于已知的复杂程度和依赖性评估整个模块。将记录与模块有关的特定观察结果。
基于所涉及的工作量将工作分配给一个或多个工程师。
2. 单元基准测试:也可以考虑在 Solaris 平台上使用合适的测试套件(在 Linux 上使用的套件,如果可
用)。在此阶段中,可以使用参考安装对现有模块进行一些基准测试。
3. 代码修改:在此阶段中,通过执行手动更改或使用 IDE 中合适的自动工具,对代码(C/C++ 代码、
makefile、脚本、参考资料等)进行适当的修改。这里假定有合适的源代码控制机制可以帮助跟踪所做
的任何更改。
45- 结论Sun Microsystems, Inc.
移植到 Solaris OS - 2007 年 1 月
4. 单元测试:代码更改完毕并且模块可以进行单元测试之后,使用 Linux 上采用的相同测试套件进行测
试。大多数情况下,可能需要将这些测试套件也移植到 Solaris OS,然后才可以使用。
5. 单元交付:在此阶段中,模块可能会进行适当的打包,作为共享库或作为将参与整体系统的组件。如果
都不可能,或与现有的任务无关,更新的模块将进入代码系统信息库,直到进行集成测试。
集成测试和功能测试
对所有模块进行移植和单元测试之后,整个产品将通过源代码系统信息库生成并进行适当的打包。完成后,
可以在 Solaris 平台上安装二进制文件并进行配置。使用可用的集成测试套件进行测试,并采用一些预批准
的标准格式记录结果。如果希望应用程序使用现有数据,可能还需要传输这些数据。
系统测试
由于商业原因,项目的这一部分非常关键,在所有模块都经历了前面的阶段之后,才能开始此部分。重新
工程的代码应符合新平台上所有已声明的目标。在功能、性能和其他预期行为方面的任何偏差需要在此阶
段进行考虑。基于问题的严重程度确定受影响的模块、程序或代码,并对代码进行适当的修改,直到解决
问题。
部署
成功进行系统测试之后,在 Solaris OS 平台上部署所移植的应用程序。部署后的任何异常行为可能需要认真
考虑和处理。
46- 结论sun.com
Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 USA 电话 1-650-960-1300 或 1-800-555-9SUN Web sun.com
 
由于 Solaris OS 和 Linux 均提供 POSIX 功能,而且 Solaris 10 OS 捆绑了许多 Linux 互操作性功能,Linux 与
Solaris OS 之间的关联与以前相比得到了显著增强。很自然,用户都期望可以很容易地将应用程序从 Linux
移植到 Solaris。大多数最新的 Linux 分发均符合 LSB 2.0 标准,这使移植任务变得更加容易。但是实际上,
移植应用程序需要进行一些非常认真细致的工作。使用特定于体系结构的扩展和特定于 OS 的扩展、内核空
间授权访问、设备直接访问和不受支持的编译程序扩展的应用程序需要进行更多的工作。不遵守可移植代
码规范的应用程序将必定需要涉及更多的工作。
Sun 提供的帮助
Sun 为将应用程序从 Linux 移植到 Solaris OS 提供了相关的工具、指南和帮助。
如果应用程序的源代码不可用, Sun 将提供一种方式,可以在使用 Solaris OS 的 x86/x64 系统上运行基于
Linux x86 的应用程序二进制文件。这个称为 lxrun 的免费实用程序可供下载;请参见
。Lxrun 是位于 Solaris 与 Linux x86 二进制可执行文件
之间的仿真程序,“即时”重映射系统调用,使其无需修改即可在针对 x86 的 Solaris OS 平台上运行。有关
此实用程序的更多信息,请参见 lxrun(1) 手册页。
BrandZ 扩展了 Solaris Zones,以创建支持非本地操作环境的标记区域 (branded zone)。每个不同的环境通过
插入 BrandZ 框架中的一个标记 (brand) 提供支持。标记可能很简单,例如将本地 Solaris OS 实用程序替换为
等效的 GNU 实用程序的环境,也可能很复杂,例如完整的 Linux 用户环境。lx 标记使 Linux 二进制文件
无需修改即可在 Solaris 10 OS 的区域 (zone) 内运行。有关更多信息,请参阅:
community/brandz。
有时,可能更适合对应用程序进行全面移植,以便为 Solaris OS 创建本地二进制文件。这样,复杂的应用程
序和 ISV 产品可以最大程度地发挥 Solaris 10 发行版提供的成熟平台的优势。如果现有的 Linux 应用程序需
要移植到 Solaris 10 OS,在开始此类项目之前,确定代码中可能会出现问题的区域会很有用。
Sun 提供源代码扫描工具来分析 C/C++ 源代码文件,并确定代码和功能的兼容性问题。可以使用 Sun 应用
程序移植助理 (Sun Application Porting Assistant, SunAPA) 确定 C/C++ 源代码文件中的移植问题。此实用程序
会分析大多数妨碍将源代码文件从 Linux 移植到 Solaris OS 的已知问题。SunAPA 可以确定可能出现的问
题,并且可以提供以下信息:
• 确定可能存在移植问题的函数调用。Sun APA 确定源代码中出现这些问题的总次数以及出现问题的位置。
• 指示解决问题的难度级别,并提供详细的帮助信息来帮助您解决问题。
• 应用程序的大小(文件总数和代码行总数)。
• 直观的界面,可以快速浏览所有移植问题。
使用 SunAPA 可以为参与大型项目的开发者节省大量的时间和精力。
在实际工作中,很希望在此类迁移项目中采用一种系统的、面向进程的方法。在第 44 页的附录 G 中,我们
推荐了一个将应用程序迁移到 Solaris 10 OS 的典型流程。
 
其他资源
Sun 还为开发者和管理员提供了与此主题有关的其他基于 Web 的资源。Sun 提供专门针对 Linux 管理员的课
程,全面介绍 Solaris OS 及其相关的 IT 基础结构。除了核心技术之外,这些课程重点介绍系统、网络和应
用程序的管理。这些课程进行了颇有价值的深入探讨,以帮助管理员快速了解有关从 Linux 迁移到 Solaris
OS 的各种问题。同样,为刚开始使用专业的开发者工具(例如 Sun™ Studio 11 软件)的开发者提供了大量
基于 Web 的资源。
有关从 Linux 迁移到 Solaris OS 平台的详细信息,请参见 Sun Web 站点上有关迁移的部分:
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(1252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~