🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 第 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)。