第 27 章 本阶段总结
在这一阶段我们又学习了很多新的语法规则,首先读者应该回到第 I 部分「C 语言入门」第 13 章「本阶段总结」把那些知识点重新总结一遍。然后我们总结一下各种开发调试工具的用法。
1. gcc
-c:编译生成目标文件(Relocatable),详见第 19 章「汇编与 C 之间的关系」第 2 节「main 函数和启动例程」。-Dmacro[=defn]:定义一个宏,详见第 21 章「预处理」第 3 节「条件预处理指示」。-E:只做预处理而不编译,cpp命令也可以达到同样的效果,详见第 21 章「预处理」第 2.1 节「函数式宏定义」。-g:在生成的目标文件中添加调试信息,所谓调试信息就是源代码和指令之间的对应关系,在gdb调试和objdump反汇编时要用到这些信息,详见第 10 章「gdb」第 1 节「单步执行和跟踪函数调用」。-Idir:dir是头文件所在的目录,详见第 20 章「链接详解」第 2.2 节「头文件」。-Ldir:dir是库文件所在的目录,详见第 20 章「链接详解」第 3 节「静态库」。-M和-MM:输出「.o文件:.c文件.h文件」这种形式的 Makefile 规则,-MM的输出不包括系统头文件,详见第 22 章「Makefile 基础」第 4 节「自动处理头文件的依赖关系」。-o outfile:outfile输出文件的文件名,详见第 19 章「汇编与 C 之间的关系」第 2 节「main 函数和启动例程」。-O?:各种编译优化选项,详见第 19 章「汇编与 C 之间的关系」第 6 节「volatile 限定符」。-print-search-dirs:打印库文件的默认搜索路径,详见第 20 章「链接详解」第 3 节「静态库」。-S:编译生成汇编代码,详见第 19 章「汇编与 C 之间的关系」第 2 节「main 函数和启动例程」。-v:打印详细的编译链接过程,详见第 19 章「汇编与 C 之间的关系」第 2 节「main 函数和启动例程」。-Wall:打印所有的警告信息,详见第 1 章「程序的基本概念」第 4 节「第一个程序」。-Wl,options:options是传递给链接器的选项,详见第 20 章「链接详解」第 4 节「共享库」。
2. gdb
- 在第 10 章「gdb」集中介绍了
gdb的基本命令和调试方法。 - 在第 19 章「汇编与 C 之间的关系」第 1 节「函数调用」提到了
gdb的指令级调试和反汇编命令。 - 如果一个程序由多个
.c文件编译链接而成,用gdb调试时如何定位某个源文件中的某一行代码呢?在第 20 章「链接详解」第 1 节「多目标文件的链接」有介绍。 - 在第 23 章「指针」第 6 节「指向指针的指针与指针数组」提到了用
gdb调试时如何给程序提供命令行参数。
3. 其它开发调试工具
as,汇编器,用法详见第 18 章「x86 汇编程序基础」例 18.1「最简单的汇编程序」。ld,链接器,用法详见第 18 章「x86 汇编程序基础」例 18.1「最简单的汇编程序」,用--verbose选项可以显示默认链接脚本,详见第 20 章「链接详解」第 1 节「多目标文件的链接」。readelf,读 ELF 文件信息,用法详见第 18 章「x86 汇编程序基础」第 5.1 节「目标文件」。objdump,显示目标文件中的信息,本书主要用它做反汇编,用法详见第 18 章「x86 汇编程序基础」第 5.1 节「目标文件」。hexdump,以十六进制或 ASCII 码显示一个文件,用法详见第 18 章「x86 汇编程序基础」第 5.1 节「目标文件」。ar,把目标文件打包成静态库,用法详见第 20 章「链接详解」第 3 节「静态库」。ranlib,给ar打包的静态库建索引,用法详见第 20 章「链接详解」第 3 节「静态库」。nm,查看符号表,用法详见第 19 章「汇编与 C 之间的关系」第 2 节「main 函数和启动例程」。