书籍详情
UNIX到Linux的移植
作者:Alfedo Mendoza,ARTIS WALKER
出版社:机械工业出版社
出版时间:2007-03-01
ISBN:9787111209119
定价:¥49.00
购买这本书可以去
内容简介
本书讲述怎样把UNIX环境下的应用程序移植到Linux环境上运行,是一本综合的开发和解决问题的参考手册 。本书详细描述了当前IT行业中被广泛应用的各种UNIX操作系统间的区别,其内容包括项目移植思考、调查、分析、移植Solaris应用程序、移植AIX应用程序、移植HP-UX应用程序、测试和调试。.它的读者对象包括开发人员、应用程序架构师以及项目经理。越来越多的开发人员、架构师和项目经理均面临着把UNIX上的C、C++和Java应用程序移植到Linux上的挑战。本书可以完整地指导你从当今最常用的UNIX平台(Solaris、HP-UX,和AIX)上把程序移植到Linux上。本书的三位作者是IBM最有经验的Linux移植专家,他们将带领你走完整个项目移植过程:调查﹑分析﹑移植和测试。他们给出了一个从开始到完成的移植方法,对关键任务的切实讨论,以及评估新项目时用到的问卷。按照本书的方法,你可以发现Linux在API、库函数、版本化、系统特性和工具等方面所提供的功能以及对你的项目的影响。另外,作者还详细讲述了每个独立的UNIX平台上特有的问题和最实用的解决方法。..本书的内容包括:*理解Linux环境: GNU二进制工具、Java环境、shell、打包工具等。*揭示并确定项目的未知因素、可变因素及其他风险。*处理具体平台的区别:标准、编译器、链接器、版本化、系统/库调用、线程等。*使用GNU调试器及Linux内存泄露和性能跟踪工具测试和调试移植后的应用程序。*包含了UNIX和Linux上API、编译器和链接器选项的快速索引,以及IBM POWER结构特有的移植问题。...
作者简介
Alfredo(Freddie)Mendoza是IBM“SystemandTechnology”部门“BusinessStrategyandEnablement”组的IT专家.他在应用程序结构和管理方面有19年的工作经验.他现在正与一些独立软件提供商一起把他们的应用程序移植到IBM交叉平台操作系统上.在此之前,Mendoza先生在IBMGlobalServices的AIX内核开发部门工作,是多个软件开发部门的技术顾问.Mendoza先生撰写了以及与人合写一些关于线程管理和软件算法的专利发明出版物.他是IntroductiontoUtilityComputing的作者,以及发表在IBMSystemsJournalUtilityComputing刊上的“DesignofanEnablementProcessforOn-DemandApplications”的合作者.ChakaratSkawratananond博士是IBM“BusinessStrategyandEnablement”部门的技术顾问.他在一些软件厂商移植应用程序到基于IBMPOWER处理器的AIX或Linux上时提供一些支持.他有10年的UNIX软件开发经验,并且发表了一些关于Linux软件移植和性能调优的文章.他拥有位于奥斯丁的得克萨斯大学的电子和计算机工程博士学位.ArtisWalker是IBM“BusinessStrategyandEnablement”部门的一个技术顾问.他在把软件厂商的应用程序移植到基于IBMPOWER的pSeries服务器(运行AIX或Linux)上时提供一些帮助.他在MicrosoftWindows和UNIX平台(包括AIX和SunSolaris)上有超过15年的经验.他具有非常丰富的软件开发经验,例如IBMDB2UniversalDatabase(DB2UDB),ORACLE,ODBC,JDBC,C,C,和Java等.他在AIX和DB2的移植和性能调优方面发表了许多指南和文章.另外,他还是“IBMEmbracesOpenSource”系列文章的发起者和主要作者,这些文章重点讲述了一些开源的解决方案,以及在基于IBMPOWER的AIX和Linux上的可操作性和设置方法.他拥有位于得克萨斯州圣安东尼奥的圣玛莉大学的学士学位.译者介绍张昕,2001年毕业于清华大学计算机系.由于一直比较喜欢自由开放的开发环境,从一开始就迷恋上了Linux.从最初漫天搜索Linux文档开始,至今不觉已6年有余.虽然阅读过不少Linux书籍文档,做过一些Linux应用程序和内核模块开发工作,但仍不敢说“掌握”了Linux,但对应用程序的编译.链接和运行,以及Linux内核的内存管理.中断处理和进程调度等,还是稍有一点儿心得.现供职于摩托罗拉公司,从事GSM通信平台的移植(PowerPC架构的vxWorks及Linux版本).关于本书及Linux方面的知识,欢迎本书读者及广大Linux爱好者通过译者的技术交流网站http
目录
目录:
译者序
序言
致谢
关于作者
第1章 项目移植思考 1
1.1 软件程序商业过程 1
1.2 移植过程 2
1.2.1 调查 2
1.2.2 分析 3
1.2.3 移植 3
1.2.4 测试 4
1.2.5 支持 4
1.3 定义项目范围和目标 4
1.4 估计 5
1.4.1 技能水平和移植经验 6
1.4.2 编译器 6
1.4.3 第三方软件和中间件的可用性 6
1.4.4 编译环境和工具 7
1.4.5 平台依赖的结构 7
1.4.6 平台/硬件依赖的代码 7
1.4.7 搭建测试环境 8
1.4.8 用户接口需求 8
1.5 创建项目移植进度表 9
1.6 从商业角度看移植过程 10
1.7 带注解的技术调查问卷样例 10
1.7.1 平台相关的内容 10
1.7.2 应用程序相关的内容 11
1.7.3 数据库内容 13
1.7.4 项目移植时间进度内容 14
1.7.5 测试相关的内容 14
1.7.6 项目移植的执行内容 15
1.8 小结 15
第2章 调查 16
2.1 编译器 16
2.1.1 GNU gcc C编译器 16
2.1.2 GNU g++ (C++)编译器 17
2.1.3 GNU g77 FORTRAN编译器 18
2.1.4 GNU Java编译器 19
2.1.5 GNU COBOL 19
2.1.6 其他编译器 19
2.2 Java环境 19
2.3 编译环境 20
2.3.1 gmake 20
2.3.2 GNU二进制工具 20
2.3.3 GNU as 21
2.3.4 集成开发环境 23
2.4 Linux Shell 23
2.5 打包 23
2.5.1 用RPM打包应用程序 24
2.5.2 RPM的基本用法 24
2.5.3 LSB推荐的基准打包格式 25
2.6 项目管理任务 25
2.7 小结 26
第3章 分析 28
3.1 Linux标准 28
3.2 GNU libc库 29
3.3 GNU科学库 30
3.4 共享库 31
3.5 库版本化 32
3.5.1 外部库版本化 32
3.5.2 符号版本化 34
3.6 动态链接器(运行时链接器) 39
3.6.1 编程接口 40
3.6.2 延迟重定位 42
3.6.3 初始化和终止化函数 43
3.7 系统调用 43
3.8 大页面支持 43
3.9 Native POSIX线程库(NPTL) 48
3.10 国际化(I18N)和本地化 49
3.10.1 iconv支持 50
3.10.2 如何创建消息目录 53
3.11 大小端环境 54
3.12 从32位移植到64位 55
3.12.1 常见的移植错误 56
3.12.2 最优方法 57
3.13 小结 57
第4章 移植Solaris应用程序 59
4.1 准备工作 59
4.1.1 搭建移植系统 59
4.1.2 搭建代码修改管理系统 59
4.1.3 搭建编译系统 60
4.2 常见的区别 60
4.2.1 C语言 61
4.2.2 C++语言 61
4.2.3 GNU C/C++语言 61
4.2.4 Java语言 61
4.2.5 线程 61
4.2.6 所支持的标准之间的比较 61
4.3 编译器 62
4.3.1 C编译器 63
4.3.2 C编译器选项 63
4.3.3 C++编译器选项 69
4.3.4 GNU g++的模板实例化 76
4.3.5 编译32位或64位目标文件 77
4.3.6 编译器的优化和性能选项 78
4.3.7 Linux平台上的命名空间选择 78
4.4 链接器 79
4.4.1 输出映射 82
4.4.2 链接器工具 82
4.4.3 共享库 82
4.4.4 库版本化 83
4.4.5 动态链接器 83
4.5 移植shell脚本到Linux 83
4.6 国际化和本地化 84
4.7 Make 85
4.7.1 为C++语言内建的Makefile变量 86
4.7.2 库依赖 86
4.7.3 空规则 86
4.7.4 当前目标 86
4.7.5 SCCS和RCS文件 87
4.7.6 有条件地给宏赋值 87
4.7.7 模式替换宏的引用 87
4.7.8 VPATH 87
4.7.9 命令执行 88
4.7.10 特殊目标 88
4.7.11 环境变量 88
4.7.12 退出状态 89
4.8 调试器 89
4.9 线程 89
4.9.1 Solaris libthread与Linux libpthread 89
4.9.2 Solaris libpthread与Linux libpthread 91
4.9.3 取消点 94
4.9.4 C++异常和Linux线程 95
4.10 信号 98
4.10.1 信号动作 98
4.10.2 简单信号 99
4.10.3 Linux的信号支持 100
4.10.4 POSIX信号捕获函数 102
4.10.5 信号集 102
4.10.6 信号信息 103
4.10.7 kill() 104
4.11 系统调用 104
4.11.1 open() 104
4.11.2 fcntl() 105
4.11.3 dirent 107
4.11.4 CPU亲和性(Affinity) 108
4.11.5 fork() 108
4.12 系统库 108
4.13 Solaris和Linux API 108
4.13.1 内存管理 109
4.13.2 进程间通信(IPC) 109
4.13.3 内存布置优化(MPO) 114
4.13.4 vfstab 115
4.13.5 posix_spawn()和posix_
spwawnp() 115
4.13.6 plock() 115
4.13.7 waitpid() 115
4.14 科学库 116
4.15 大页面支持 117
4.16 Solaris上一些不可移植的编程用法 117
4.17 小结 117
第5章 移植AIX应用程序 119
5.1 准备工作 119
5.1.1 搭建移植系统 119
5.1.2 搭建代码修改管理系统 119
5.1.3 搭建编译系统 120
5.2 常见的区别 120
5.2.1 C语言 120
5.2.2 C++语言 121
5.2.3 GNU C/C++语言 121
5.2.4 Java语言 121
5.2.5 线程 121
5.2.6 所支持的标准之间的比较 121
5.3 编译器 122
5.4 Make 130
5.5 链接器 131
5.5.1 链接器的不兼容性 131
5.5.2 链接器:从AIX移植到Linux
参考手册 133
5.6 AIX和Linux创建共享库的比较 133
5.7 动态装载 134
5.8 AIX和Linux上模板实例化的区别 135
5.8.1 使用#pragma或#include 135
5.8.2 GNU中其他可用的模板选项 138
5.9 C++filt工具 138
5.10 系统API:AIX/Linux 139
5.11 部分AIX/Linux系统API之间的比较 143
5.11.1 getfsent()、 getfsfile()、getfstype()、getfsspec() 144
5.11.2 ioctl() 145
5.11.3 read()、write() 146
5.11.4 confstr() 148
5.11.5 opendir() 148
5.11.6 readdir() 149
5.11.7 fcntl() 149
5.11.8 llseek()、lseek()、lseek64() 153
5.11.9 uname() 154
5.11.10 syslog()、closelog()、openlog() 154
5.11.11 swapoff()、swapon() 155
5.11.12 acct() 156
5.11.13 mmap()、mmap64()、
munmap() 157
5.11.14 pread()、pwrite() 159
5.11.15 stat()、 lstat()、fstat() 160
5.11.16 ptrace() 161
5.11.17 setgid()、setregid() 163
5.11.18 sync() 163
5.11.19 wait3()、wait4() 164
5.11.20 getcwd() 165
5.11.21 mount()、umount()、vmount() 166
5.11.22 readv()、writev() 169
5.11.23 select() 170
5.11.24 reboot() 172
5.11.25 chroot() 173
5.11.26 fstatfs()、statfs() 174
5.11.27 poll() 176
5.11.28 quotactl() 177
5.12 AIX上的一些非标准的编程用法 179
5.13 信号 180
5.13.1 信号动作 180
5.13.2 简单信号 180
5.14 网络编程 185
5.15 进程间通信(IPC) 186
5.15.1 信号量 186
5.15.2 系统V信号量集 187
5.15.3 消息队列 188
5.15.4 共享内存 190
5.16 POSIX线程 191
5.16.1 Linux和AIX的线程模型比较 191
5.16.2 内核空间线程 192
5.16.3 用户空间线程 192
5.16.4 AIX和Linux POSIX线程
交叉对比 192
5.17 大页面支持 195
5.18 通用API 195
5.19 小结 195
第6章 移植HP-UX应用程序 198
6.1 准备工作 198
6.1.1 搭建移植系统 198
6.1.2 搭建代码修改管理系统 198
6.1.3 搭建编译环境 199
6.2 常见的区别 199
6.2.1 C语言 199
6.2.2 C++语言 200
6.2.3 GNU C/C++语言 200
6.2.4 Java语言 200
6.2.5 线程 200
6.2.6 所支持标准之间的比较 200
6.3 编译器 201
6.3.1 C编译器选项 202
6.3.2 C++编译器选项 205
6.3.3 GNU g++的模板实例化 208
6.3.4 编译32/64位二进制程序 210
6.3.5 编译器优化和性能选项 210
6.3.6 使用GNU进行移植和编译 211
6.3.7 Linux平台上的命名空间选择 212
6.4 链接器 213
6.4.1 输出映射 214
6.4.2 链接器工具 214
6.5 库版本化 214
6.5.1 HP-UX上的库版本化 214
6.5.2 Linux上的库版本化 215
6.6 动态链接和共享库 215
6.7 移植shell脚本到Linux 216
6.8 国际化(I18N) 217
6.9 软件开发工具 220
6.9.1 Makefile语法 221
6.9.2 调试器 222
6.10 线程 223
6.10.1 HP-UX和Linux上的线程支持 224
6.10.2 HP-UX DCE和POSIX线程的
区别 227
6.10.3 调试Linux线程 228
6.10.4 C++异常和Linux线程 233
6.10.5 链接线程安全的库 239
6.11 信号 239
6.11.1 信号动作 239
6.11.2 简单信号 240
6.11.3 信号发送 241
6.11.4 Linux的信号支持 242
6.11.5 POSIX信号捕获函数 242
6.11.6 信号信息 243
6.11.7 信号默认动作 245
6.12 HP-UX上的系统调用和Linux上的
对应调用 246
6.12.1 检查POSIX API支持 246
6.12.2 检查Linux内核版本 251
6.13 系统库 251
6.14 GNU科学库 252
6.15 HP-UX和Linux API 253
6.15.1 glibc版本 253
6.15.2 glibc遵循的标准 254
6.15.3 HP-UX上的一些不可移植的
编程用法 254
6.16 进程间通信 254
6.16.1 管道 255
6.16.2 FIFO 255
6.16.3 POSIX消息队列 255
6.16.4 POSIX信号量 256
6.16.5 POSIX共享内存 257
6.16.6 系统V共享内存 257
6.16.7 系统V消息 257
6.16.8 系统V信号量 258
6.17 小结 258
第7章 测试和调试 260
7.1 使用GNU调试器 260
7.1.1 编译可以使用GDB的程序 260
7.1.2 调用GDB 261
7.1.3 GDB基本命令 261
7.1.4 调试多进程 262
7.1.5 调试多线程应用程序 263
7.1.6 停止多线程程序 266
7.1.7 GDB初始化文件 267
7.1.8 GDB和信号 267
7.1.9 GDB的图形化前端 269
7.2 strace和ltrace 270
7.3 cscope工具 270
7.4 glibc调试支持 272
7.5 内存调试工具 274
7.5.1 Electric Fence 274
7.5.2 GNU/Linux mtrace、mcheck、MALLOC_CHECK 275
7.5.3 Mpatrol 276
7.5.4 dmalloc 277
7.5.5 valgrind 277
7.5.6 Rational Purify 278
7.5.7 Insure++ 278
7.6 静态程序检查器 279
7.6.1 Splint 279
7.6.2 CodeSonar 279
7.7 线程跟踪工具 279
7.8 性能监测工具 280
7.8.1 内部视角 280
7.8.2 外部视角 286
7.8.3 其他工具 290
7.9 小结 292
附录A Solaris到Linux参考表 293
附录B AIX到Linux参考表 319
附录C HP-UX到Linux参考表 334
附录D POWER上的Linux 384
附录E gprof helper 387
附录F IBM zSeries大型机相关的
移植问题 390
附录G Solaris到Linux移植:系统
管理员指南 397
译者序
序言
致谢
关于作者
第1章 项目移植思考 1
1.1 软件程序商业过程 1
1.2 移植过程 2
1.2.1 调查 2
1.2.2 分析 3
1.2.3 移植 3
1.2.4 测试 4
1.2.5 支持 4
1.3 定义项目范围和目标 4
1.4 估计 5
1.4.1 技能水平和移植经验 6
1.4.2 编译器 6
1.4.3 第三方软件和中间件的可用性 6
1.4.4 编译环境和工具 7
1.4.5 平台依赖的结构 7
1.4.6 平台/硬件依赖的代码 7
1.4.7 搭建测试环境 8
1.4.8 用户接口需求 8
1.5 创建项目移植进度表 9
1.6 从商业角度看移植过程 10
1.7 带注解的技术调查问卷样例 10
1.7.1 平台相关的内容 10
1.7.2 应用程序相关的内容 11
1.7.3 数据库内容 13
1.7.4 项目移植时间进度内容 14
1.7.5 测试相关的内容 14
1.7.6 项目移植的执行内容 15
1.8 小结 15
第2章 调查 16
2.1 编译器 16
2.1.1 GNU gcc C编译器 16
2.1.2 GNU g++ (C++)编译器 17
2.1.3 GNU g77 FORTRAN编译器 18
2.1.4 GNU Java编译器 19
2.1.5 GNU COBOL 19
2.1.6 其他编译器 19
2.2 Java环境 19
2.3 编译环境 20
2.3.1 gmake 20
2.3.2 GNU二进制工具 20
2.3.3 GNU as 21
2.3.4 集成开发环境 23
2.4 Linux Shell 23
2.5 打包 23
2.5.1 用RPM打包应用程序 24
2.5.2 RPM的基本用法 24
2.5.3 LSB推荐的基准打包格式 25
2.6 项目管理任务 25
2.7 小结 26
第3章 分析 28
3.1 Linux标准 28
3.2 GNU libc库 29
3.3 GNU科学库 30
3.4 共享库 31
3.5 库版本化 32
3.5.1 外部库版本化 32
3.5.2 符号版本化 34
3.6 动态链接器(运行时链接器) 39
3.6.1 编程接口 40
3.6.2 延迟重定位 42
3.6.3 初始化和终止化函数 43
3.7 系统调用 43
3.8 大页面支持 43
3.9 Native POSIX线程库(NPTL) 48
3.10 国际化(I18N)和本地化 49
3.10.1 iconv支持 50
3.10.2 如何创建消息目录 53
3.11 大小端环境 54
3.12 从32位移植到64位 55
3.12.1 常见的移植错误 56
3.12.2 最优方法 57
3.13 小结 57
第4章 移植Solaris应用程序 59
4.1 准备工作 59
4.1.1 搭建移植系统 59
4.1.2 搭建代码修改管理系统 59
4.1.3 搭建编译系统 60
4.2 常见的区别 60
4.2.1 C语言 61
4.2.2 C++语言 61
4.2.3 GNU C/C++语言 61
4.2.4 Java语言 61
4.2.5 线程 61
4.2.6 所支持的标准之间的比较 61
4.3 编译器 62
4.3.1 C编译器 63
4.3.2 C编译器选项 63
4.3.3 C++编译器选项 69
4.3.4 GNU g++的模板实例化 76
4.3.5 编译32位或64位目标文件 77
4.3.6 编译器的优化和性能选项 78
4.3.7 Linux平台上的命名空间选择 78
4.4 链接器 79
4.4.1 输出映射 82
4.4.2 链接器工具 82
4.4.3 共享库 82
4.4.4 库版本化 83
4.4.5 动态链接器 83
4.5 移植shell脚本到Linux 83
4.6 国际化和本地化 84
4.7 Make 85
4.7.1 为C++语言内建的Makefile变量 86
4.7.2 库依赖 86
4.7.3 空规则 86
4.7.4 当前目标 86
4.7.5 SCCS和RCS文件 87
4.7.6 有条件地给宏赋值 87
4.7.7 模式替换宏的引用 87
4.7.8 VPATH 87
4.7.9 命令执行 88
4.7.10 特殊目标 88
4.7.11 环境变量 88
4.7.12 退出状态 89
4.8 调试器 89
4.9 线程 89
4.9.1 Solaris libthread与Linux libpthread 89
4.9.2 Solaris libpthread与Linux libpthread 91
4.9.3 取消点 94
4.9.4 C++异常和Linux线程 95
4.10 信号 98
4.10.1 信号动作 98
4.10.2 简单信号 99
4.10.3 Linux的信号支持 100
4.10.4 POSIX信号捕获函数 102
4.10.5 信号集 102
4.10.6 信号信息 103
4.10.7 kill() 104
4.11 系统调用 104
4.11.1 open() 104
4.11.2 fcntl() 105
4.11.3 dirent 107
4.11.4 CPU亲和性(Affinity) 108
4.11.5 fork() 108
4.12 系统库 108
4.13 Solaris和Linux API 108
4.13.1 内存管理 109
4.13.2 进程间通信(IPC) 109
4.13.3 内存布置优化(MPO) 114
4.13.4 vfstab 115
4.13.5 posix_spawn()和posix_
spwawnp() 115
4.13.6 plock() 115
4.13.7 waitpid() 115
4.14 科学库 116
4.15 大页面支持 117
4.16 Solaris上一些不可移植的编程用法 117
4.17 小结 117
第5章 移植AIX应用程序 119
5.1 准备工作 119
5.1.1 搭建移植系统 119
5.1.2 搭建代码修改管理系统 119
5.1.3 搭建编译系统 120
5.2 常见的区别 120
5.2.1 C语言 120
5.2.2 C++语言 121
5.2.3 GNU C/C++语言 121
5.2.4 Java语言 121
5.2.5 线程 121
5.2.6 所支持的标准之间的比较 121
5.3 编译器 122
5.4 Make 130
5.5 链接器 131
5.5.1 链接器的不兼容性 131
5.5.2 链接器:从AIX移植到Linux
参考手册 133
5.6 AIX和Linux创建共享库的比较 133
5.7 动态装载 134
5.8 AIX和Linux上模板实例化的区别 135
5.8.1 使用#pragma或#include 135
5.8.2 GNU中其他可用的模板选项 138
5.9 C++filt工具 138
5.10 系统API:AIX/Linux 139
5.11 部分AIX/Linux系统API之间的比较 143
5.11.1 getfsent()、 getfsfile()、getfstype()、getfsspec() 144
5.11.2 ioctl() 145
5.11.3 read()、write() 146
5.11.4 confstr() 148
5.11.5 opendir() 148
5.11.6 readdir() 149
5.11.7 fcntl() 149
5.11.8 llseek()、lseek()、lseek64() 153
5.11.9 uname() 154
5.11.10 syslog()、closelog()、openlog() 154
5.11.11 swapoff()、swapon() 155
5.11.12 acct() 156
5.11.13 mmap()、mmap64()、
munmap() 157
5.11.14 pread()、pwrite() 159
5.11.15 stat()、 lstat()、fstat() 160
5.11.16 ptrace() 161
5.11.17 setgid()、setregid() 163
5.11.18 sync() 163
5.11.19 wait3()、wait4() 164
5.11.20 getcwd() 165
5.11.21 mount()、umount()、vmount() 166
5.11.22 readv()、writev() 169
5.11.23 select() 170
5.11.24 reboot() 172
5.11.25 chroot() 173
5.11.26 fstatfs()、statfs() 174
5.11.27 poll() 176
5.11.28 quotactl() 177
5.12 AIX上的一些非标准的编程用法 179
5.13 信号 180
5.13.1 信号动作 180
5.13.2 简单信号 180
5.14 网络编程 185
5.15 进程间通信(IPC) 186
5.15.1 信号量 186
5.15.2 系统V信号量集 187
5.15.3 消息队列 188
5.15.4 共享内存 190
5.16 POSIX线程 191
5.16.1 Linux和AIX的线程模型比较 191
5.16.2 内核空间线程 192
5.16.3 用户空间线程 192
5.16.4 AIX和Linux POSIX线程
交叉对比 192
5.17 大页面支持 195
5.18 通用API 195
5.19 小结 195
第6章 移植HP-UX应用程序 198
6.1 准备工作 198
6.1.1 搭建移植系统 198
6.1.2 搭建代码修改管理系统 198
6.1.3 搭建编译环境 199
6.2 常见的区别 199
6.2.1 C语言 199
6.2.2 C++语言 200
6.2.3 GNU C/C++语言 200
6.2.4 Java语言 200
6.2.5 线程 200
6.2.6 所支持标准之间的比较 200
6.3 编译器 201
6.3.1 C编译器选项 202
6.3.2 C++编译器选项 205
6.3.3 GNU g++的模板实例化 208
6.3.4 编译32/64位二进制程序 210
6.3.5 编译器优化和性能选项 210
6.3.6 使用GNU进行移植和编译 211
6.3.7 Linux平台上的命名空间选择 212
6.4 链接器 213
6.4.1 输出映射 214
6.4.2 链接器工具 214
6.5 库版本化 214
6.5.1 HP-UX上的库版本化 214
6.5.2 Linux上的库版本化 215
6.6 动态链接和共享库 215
6.7 移植shell脚本到Linux 216
6.8 国际化(I18N) 217
6.9 软件开发工具 220
6.9.1 Makefile语法 221
6.9.2 调试器 222
6.10 线程 223
6.10.1 HP-UX和Linux上的线程支持 224
6.10.2 HP-UX DCE和POSIX线程的
区别 227
6.10.3 调试Linux线程 228
6.10.4 C++异常和Linux线程 233
6.10.5 链接线程安全的库 239
6.11 信号 239
6.11.1 信号动作 239
6.11.2 简单信号 240
6.11.3 信号发送 241
6.11.4 Linux的信号支持 242
6.11.5 POSIX信号捕获函数 242
6.11.6 信号信息 243
6.11.7 信号默认动作 245
6.12 HP-UX上的系统调用和Linux上的
对应调用 246
6.12.1 检查POSIX API支持 246
6.12.2 检查Linux内核版本 251
6.13 系统库 251
6.14 GNU科学库 252
6.15 HP-UX和Linux API 253
6.15.1 glibc版本 253
6.15.2 glibc遵循的标准 254
6.15.3 HP-UX上的一些不可移植的
编程用法 254
6.16 进程间通信 254
6.16.1 管道 255
6.16.2 FIFO 255
6.16.3 POSIX消息队列 255
6.16.4 POSIX信号量 256
6.16.5 POSIX共享内存 257
6.16.6 系统V共享内存 257
6.16.7 系统V消息 257
6.16.8 系统V信号量 258
6.17 小结 258
第7章 测试和调试 260
7.1 使用GNU调试器 260
7.1.1 编译可以使用GDB的程序 260
7.1.2 调用GDB 261
7.1.3 GDB基本命令 261
7.1.4 调试多进程 262
7.1.5 调试多线程应用程序 263
7.1.6 停止多线程程序 266
7.1.7 GDB初始化文件 267
7.1.8 GDB和信号 267
7.1.9 GDB的图形化前端 269
7.2 strace和ltrace 270
7.3 cscope工具 270
7.4 glibc调试支持 272
7.5 内存调试工具 274
7.5.1 Electric Fence 274
7.5.2 GNU/Linux mtrace、mcheck、MALLOC_CHECK 275
7.5.3 Mpatrol 276
7.5.4 dmalloc 277
7.5.5 valgrind 277
7.5.6 Rational Purify 278
7.5.7 Insure++ 278
7.6 静态程序检查器 279
7.6.1 Splint 279
7.6.2 CodeSonar 279
7.7 线程跟踪工具 279
7.8 性能监测工具 280
7.8.1 内部视角 280
7.8.2 外部视角 286
7.8.3 其他工具 290
7.9 小结 292
附录A Solaris到Linux参考表 293
附录B AIX到Linux参考表 319
附录C HP-UX到Linux参考表 334
附录D POWER上的Linux 384
附录E gprof helper 387
附录F IBM zSeries大型机相关的
移植问题 390
附录G Solaris到Linux移植:系统
管理员指南 397
猜您喜欢