第1章 实验环境构建 1
1.1 安装Linux 1
1.1.1 下载CentOS7 1
1.1.2 CentOS7安装 2
1.2 虚拟机安装Linux 9
1.2.1 VirtualBox安装 9
1.2.2 虚拟机配置 13
1.2.3 虚拟机安装Linux 20
1.3 ssh远程终端访问 20
1.3.1 PuTTY客户端 21
1.3.2 无密码登录 24
1.3.3 Xming图形终端 26
1.4 初次接触Linux 28
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.6 GCC编译驱动 49
2.2 GCC基本用法 51
2.2.1 C语言标准 53
2.2.2 库的使用 54
2.2.3 搜索路径 60
2.2.4 编译警告 65
2.3 GDB调试 70
2.3.1 代码准备 71
2.3.2 运行代码 73
2.3.3 查看变量和内存 77
2.3.4 图形前端TUI 83
2.4 小结 84
练习 84
第3章 数据、运算与控制 86
3.1 x86-64 ISA 86
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.3 ELF文件与装入 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章 链接脚本与makefile 252
5.1 二进制工具和链接脚本 252
5.1.1 binutils 252
5.1.2 链接器脚本 254
5.2 makefile 267
5.2.1 makefile基本格式 267
5.2.2 makefile规则 270
5.2.3 makefile变量 274
5.2.4 文件指示 277
5.2.5 函数 279
5.2.6 make 281
5.3 小结 282
练习 283
第6章 程序运行 284
6.1 装入与运行 284
6.1.1 ELF装载器 284
6.1.2 内核代码 285
6.1.3 进程与线程 285
6.1.4 工作环境 287
6.2 基本行为观察 289
6.2.1 ptrace 289
6.2.2 strace 295
6.2.3 GDB断点原理 300
6.2.4 ltrace 301
6.3 异常行为 304
6.3.1 非法操作 304
6.3.2 响应信号 309
6.3.3 core文件 315
6.4 小结 325
练习 326
第7章 性能剖析 327
7.1 打桩方法 327
7.1.1 源代码预处理时 328
7.1.2 静态链接时 330
7.1.3 运行加载时 332
7.2 gprof 334
7.2.1 工作原理 335
7.2.2 gprof示例 335
7.2.3 性能数据解读 343
7.2.4 图形化显示(gprof2dot.py+graphviz) 348
7.3 g 349
7.3.1 基于函数分析的缺点 349
7.3.2 gcov逐行分析 351
7.4 其他分析工具 355
7.4.1 Valgrind 355
7.4.2 perf 368
7.5 小结 375
练习 376
第8章 综合实例:HDFS中实现zlib库的旁路 377
8.1 项目需求 377
8.2 系统分析 378
8.2.1 整体方案 378
8.2.2 Haddop的gzip JNI 379
8.2.3 zlib分析 382
8.2.4 测定z_stream成员大小 385
8.3 编码实现 387
8.3.1 zlib日志 387
8.3.2 Log4c 388
8.3.3 使用libcprss.so库 396
8.4 功能验证 398
8.4.1 准备输入文件 399
8.4.2 zlib原生库的压缩 399
8.4.3 libcprss.so库的压缩 401
8.5 小结 401
附录 402