# 第 27 章 本阶段总结
在这一阶段我们又学习了很多新的语法规则,首先读者应该回到[第 13 章 _本阶段总结_](ch13.html#summary1)把那些知识点重新总结一遍。然后我们总结一下各种开发调试工具的用法。
1、gcc
`-c`
编译生成目标文件(Relocatable),详见[第 2 节 “`main`函数和启动例程”](ch19s02.html#asmc.main)。
`-Dmacro[=defn]`
定义一个宏,详见[第 3 节 “条件预处理指示”](ch21s03.html#prep.cond)。
`-E`
只做预处理而不编译,`cpp`命令也可以达到同样的效果,详见[第 2.1 节 “函数式宏定义”](ch21s02.html#prep.funcmacro)。
`-g`
在生成的目标文件中添加调试信息,所谓调试信息就是源代码和指令之间的对应关系,在`gdb`调试和`objdump`反汇编时要用到这些信息,详见[第 1 节 “单步执行和跟踪函数调用”](ch10s01.html#gdb.step)。
`-Idir`
`dir`是头文件所在的目录,详见[第 2.2 节 “头文件”](ch20s02.html#link.header)。
`-Ldir`
`dir`是库文件所在的目录,详见[第 3 节 “静态库”](ch20s03.html#link.staticlib)。
`-M`和`-MM`
输出“`.o`文件: `.c`文件 `.h`文件”这种形式的Makefile规则,`-MM`的输出不包括系统头文件,详见[第 4 节 “自动处理头文件的依赖关系”](ch22s04.html#make.header)。
`-o outfile`
`outfile`输出文件的文件名,详见[第 2 节 “`main`函数和启动例程”](ch19s02.html#asmc.main)。
`-O?`
各种编译优化选项,详见[第 6 节 “volatile限定符”](ch19s06.html#asmc.volatile)。
`-print-search-dirs`
打印库文件的默认搜索路径,详见[第 3 节 “静态库”](ch20s03.html#link.staticlib)。
`-S`
编译生成汇编代码,详见[第 2 节 “`main`函数和启动例程”](ch19s02.html#asmc.main)。
`-v`
打印详细的编译链接过程,详见[第 2 节 “`main`函数和启动例程”](ch19s02.html#asmc.main)。
`-Wall`
打印所有的警告信息,详见[第 4 节 “第一个程序”](intro.helloworld.html "4. 第一个程序")。
`-Wl,options`
`options`是传递给链接器的选项,详见[第 4 节 “共享库”](ch20s04.html#link.shared)。
2、gdb
1. 在[第 10 章 _gdb_](ch10.html#gdb)集中介绍了`gdb`的基本命令和调试方法。
2. 在[第 1 节 “函数调用”](ch19s01.html#asmc.funccall)提到了`gdb`的指令级调试和反汇编命令。
3. 如果一个程序由多个`.c`文件编译链接而成,用`gdb`调试时如何定位某个源文件中的某一行代码呢?在[第 1 节 “多目标文件的链接”](ch20s01.html#link.basic)有介绍。
4. 在[第 6 节 “指向指针的指针与指针数组”](ch23s06.html#pointer.parray)提到了用`gdb`调试时如何给程序提供命令行参数。
3、其它开发调试工具
1. `as`,汇编器,用法详见[例 18.1 “最简单的汇编程序”](ch18s01.html#asm.simpleasm)。
2. `ld`,链接器,用法详见[例 18.1 “最简单的汇编程序”](ch18s01.html#asm.simpleasm),用`--verbose`选项可以显示默认链接脚本,详见[第 1 节 “多目标文件的链接”](ch20s01.html#link.basic)。
3. `readelf`,读ELF文件信息,用法详见[第 5.1 节 “目标文件”](ch18s05.html#asm.relocatable)。
4. `objdump`,显示目标文件中的信息,本书主要用它做反汇编,用法详见[第 5.1 节 “目标文件”](ch18s05.html#asm.relocatable)。
5. `hexdump`,以十六进制或ASCII码显示一个文件,用法详见[第 5.1 节 “目标文件”](ch18s05.html#asm.relocatable)。
6. `ar`,把目标文件打包成静态库,用法详见[第 3 节 “静态库”](ch20s03.html#link.staticlib)。
7. `ranlib`,给`ar`打包的静态库建索引,用法详见[第 3 节 “静态库”](ch20s03.html#link.staticlib)。
8. `nm`,查看符号表,用法详见[第 2 节 “`main`函数和启动例程”](ch19s02.html#asmc.main)。
- Linux C编程一站式学习
- 历史
- 前言
- 部分 I. C语言入门
- 第 1 章 程序的基本概念
- 第 2 章 常量、变量和表达式
- 第 3 章 简单函数
- 第 4 章 分支语句
- 第 5 章 深入理解函数
- 第 6 章 循环语句
- 第 7 章 结构体
- 第 8 章 数组
- 第 9 章 编码风格
- 第 10 章 gdb
- 第 11 章 排序与查找
- 第 12 章 栈与队列
- 第 13 章 本阶段总结
- 部分 II. C语言本质
- 第 14 章 计算机中数的表示
- 第 15 章 数据类型详解
- 第 16 章 运算符详解
- 第 17 章 计算机体系结构基础
- 第 18 章 x86汇编程序基础
- 第 19 章 汇编与C之间的关系
- 第 20 章 链接详解
- 第 21 章 预处理
- 第 22 章 Makefile基础
- 第 23 章 指针
- 第 24 章 函数接口
- 第 25 章 C标准库
- 第 26 章 链表、二叉树和哈希表
- 第 27 章 本阶段总结
- 部分 III. Linux系统编程
- 第 28 章 文件与I/O
- 第 29 章 文件系统
- 第 30 章 进程
- 第 31 章 Shell脚本
- 第 32 章 正则表达式
- 第 33 章 信号
- 第 34 章 终端、作业控制与守护进程
- 第 35 章 线程
- 第 36 章 TCP/IP协议基础
- 第 37 章 socket编程
- 附录 A. 字符编码
- 附录 B. GNU Free Documentation License Version 1.3, 3 November 2008
- 参考书目
- 索引