作者: 罗秋明
出版社: 清华大学出版社
出版年: 2020年05月
ISBN: 9787302545491
~~滚到底部有网盘下载链接~~
内容简介
本书所讨论的内容是“C语言程序设计”类课程的后续知识,涉及C程序在Linux环境下经过GCC编译/链接生成可执行文件以及在系统中运行的问题。本书能使读者在面对C程序的工程实践问题时,做到心中有数、处处不存疑。 全书共7章,第1章介绍环境准备,第2章介绍C程序的预处理、编译、汇编和链接的全过程,并介绍了一点关于GCC编译命令及编译选项、GDB调试初步概念,第3章专注于编译环节,即从C到汇编的转换,第4章专注于链接过程,第5章介绍可执行文件在系统中运行时,观察进程与系统的关系、进程对库的调用、程序异常行为等问题,第6、7章介绍一些性能剖析方法,包括GCC自带工具、库函数打桩方法、valgrind及perf工具的简单使用等,第8章介绍一个综合性的实例,即如何将HDFS文件系统使用的gzip压缩,从利用zlib库在CPU上计算转换成利用FPGA加速卡的过程。该实例涉及库的使用和修改、makefile以及相应的C程序实现等多方面知识,让读者从一个工程需求的角度考察其方案与实现。每章后面都有一些练习题,其中有一个与zlib库相关的任务贯穿了各章,读者通过这个连贯的练习将各章知识融会贯通。 本书可以作为计算机及相关专业高年级本科生或研究生学习Linux环境下的C程序设计教学用书,对希望深入了解Linux内核的读者和相关开发人员也非常有参考价值。
目录
第1章实验环境构建1
1.1安装Linux1
1.1.1下载CentOS71
1.1.2CentOS7安装2
1.2虚拟机安装Linux9
1.2.1VirtualBox安装9
1.2.2虚拟机配置13
1.2.3虚拟机安装Linux20
1.3ssh远程终端访问20
1.3.1PuTTY客户端21
1.3.2无密码登录24
1.3.3Xming图形终端26
1.4初次接触Linux28
1.4.1简单操作28
1.4.2运行HelloWorld程序33
1.5小结37
第2章程序编译与运行38
2.1编译的各阶段39
2.1.1源代码39
2.1.2预处理40
2.1.3编译44
2.1.4汇编46
2.1.5链接48
2.1.6GCC编译驱动49
2.2GCC基本用法51
2.2.1C语言标准53
2.2.2库的使用54
2.2.3搜索路径60
2.2.4编译警告65
2.3GDB调试70
2.3.1代码准备71
2.3.2运行代码73
2.3.3查看变量和内存77
2.3.4图形前端TUI83
2.4小结84
练习84
Linux GNU C程序观察目录
第3章数据、运算与控制86
3.1x8664 ISA86
3.1.1寄存器86
3.1.2内存空间与I/O空间91
3.2数据92
3.2.1数据大小、字节序92
3.2.2数组、结构体和联合体95
3.2.3数据布局98
3.3运算102
3.3.1数据传送102
3.3.2算术/逻辑运算104
3.3.3加载有效地址106
3.4控制107
3.4.1条件跳转107
3.4.2函数调用127
3.5小结159
练习159
第4章链接与可执行文件161
4.1生成可执行文件161
4.1.1样例代码162
4.1.2进程影像164
4.1.3ELF文件与装入168
4.2可重定位目标文件182
4.2.1目标文件的节(section)183
4.2.2符号及重定位187
4.2.3符号表196
4.3静态链接200
4.3.1布局200
4.3.2符号解析205
4.3.3静态重定位207
4.4动态链接214
4.4.1样例代码215
4.4.2动态链接库216
4.4.3动态链接步骤230
4.5小结250
练习251
第5章链接脚本与makefile252
5.1二进制工具和链接脚本252
5.1.1binutils252
5.1.2链接器脚本254
5.2makefile267
5.2.1makefile基本格式267
5.2.2makefile规则270
5.2.3makefile变量274
5.2.4文件指示277
5.2.5函数279
5.2.6make281
5.3小结282
练习283
第6章程序运行284
6.1装入与运行284
6.1.1ELF装载器284
6.1.2内核代码285
6.1.3进程与线程285
6.1.4工作环境287
6.2基本行为观察289
6.2.1ptrace289
6.2.2strace295
6.2.3GDB断点原理300
6.2.4ltrace301
6.3异常行为304
6.3.1非法操作304
6.3.2响应信号309
6.3.3core文件315
6.4小结325
练习326
第7章性能剖析327
7.1打桩方法327
7.1.1源代码预处理时328
7.1.2静态链接时330
7.1.3运行加载时332
7.2gprof334
7.2.1工作原理335
7.2.2gprof示例335
7.2.3性能数据解读343
7.2.4图形化显示(gprof2dot.py graphviz)348
7.3gcov349
7.3.1基于函数分析的缺点349
7.3.2gcov逐行分析351
7.4其他分析工具355
7.4.1Valgrind355
7.4.2perf368
7.5小结375
练习376
第8章综合实例: HDFS中实现zlib库的旁路377
8.1项目需求377
8.2系统分析378
8.2.1整体方案378
8.2.2Haddop的gzip JNI379
8.2.3zlib分析382
8.2.4测定z_stream成员大小385
8.3编码实现387
8.3.1zlib日志387
8.3.2Log4c388
8.3.3使用libcprss.so库396
8.4功能验证398
8.4.1准备输入文件399
8.4.2zlib原生库的压缩399
8.4.3libcprss.so库的压缩401
8.5小结401
附录402
显示部分信息
1.1安装Linux1
1.1.1下载CentOS71
1.1.2CentOS7安装2
1.2虚拟机安装Linux9
1.2.1VirtualBox安装9
1.2.2虚拟机配置13
1.2.3虚拟机安装Linux20
1.3ssh远程终端访问20
1.3.1PuTTY客户端21
1.3.2无密码登录24
1.3.3Xming图形终端26
1.4初次接触Linux28
1.4.1简单操作28
1.4.2运行HelloWorld程序33
1.5小结37
第2章程序编译与运行38
2.1编译的各阶段39
2.1.1源代码39
2.1.2预处理40
2.1.3编译44
2.1.4汇编46
2.1.5链接48
2.1.6GCC编译驱动49
2.2GCC基本用法51
2.2.1C语言标准53
2.2.2库的使用54
2.2.3搜索路径60
2.2.4编译警告65
2.3GDB调试70
2.3.1代码准备71
2.3.2运行代码73
2.3.3查看变量和内存77
2.3.4图形前端TUI83
2.4小结84
练习84
Linux GNU C程序观察目录
第3章数据、运算与控制86
3.1x8664 ISA86
3.1.1寄存器86
3.1.2内存空间与I/O空间91
3.2数据92
3.2.1数据大小、字节序92
3.2.2数组、结构体和联合体95
3.2.3数据布局98
3.3运算102
3.3.1数据传送102
3.3.2算术/逻辑运算104
3.3.3加载有效地址106
3.4控制107
3.4.1条件跳转107
3.4.2函数调用127
3.5小结159
练习159
第4章链接与可执行文件161
4.1生成可执行文件161
4.1.1样例代码162
4.1.2进程影像164
4.1.3ELF文件与装入168
4.2可重定位目标文件182
4.2.1目标文件的节(section)183
4.2.2符号及重定位187
4.2.3符号表196
4.3静态链接200
4.3.1布局200
4.3.2符号解析205
4.3.3静态重定位207
4.4动态链接214
4.4.1样例代码215
4.4.2动态链接库216
4.4.3动态链接步骤230
4.5小结250
练习251
第5章链接脚本与makefile252
5.1二进制工具和链接脚本252
5.1.1binutils252
5.1.2链接器脚本254
5.2makefile267
5.2.1makefile基本格式267
5.2.2makefile规则270
5.2.3makefile变量274
5.2.4文件指示277
5.2.5函数279
5.2.6make281
5.3小结282
练习283
第6章程序运行284
6.1装入与运行284
6.1.1ELF装载器284
6.1.2内核代码285
6.1.3进程与线程285
6.1.4工作环境287
6.2基本行为观察289
6.2.1ptrace289
6.2.2strace295
6.2.3GDB断点原理300
6.2.4ltrace301
6.3异常行为304
6.3.1非法操作304
6.3.2响应信号309
6.3.3core文件315
6.4小结325
练习326
第7章性能剖析327
7.1打桩方法327
7.1.1源代码预处理时328
7.1.2静态链接时330
7.1.3运行加载时332
7.2gprof334
7.2.1工作原理335
7.2.2gprof示例335
7.2.3性能数据解读343
7.2.4图形化显示(gprof2dot.py graphviz)348
7.3gcov349
7.3.1基于函数分析的缺点349
7.3.2gcov逐行分析351
7.4其他分析工具355
7.4.1Valgrind355
7.4.2perf368
7.5小结375
练习376
第8章综合实例: HDFS中实现zlib库的旁路377
8.1项目需求377
8.2系统分析378
8.2.1整体方案378
8.2.2Haddop的gzip JNI379
8.2.3zlib分析382
8.2.4测定z_stream成员大小385
8.3编码实现387
8.3.1zlib日志387
8.3.2Log4c388
8.3.3使用libcprss.so库396
8.4功能验证398
8.4.1准备输入文件399
8.4.2zlib原生库的压缩399
8.4.3libcprss.so库的压缩401
8.5小结401
附录402
显示部分信息