在这一阶段我们又学习了很多新的语法规则,首先读者应该回到上篇的阶段总结把那些知识点重新总结一遍。然后我们总结一下各种开发调试工具的用法。
-
gcc的常用选项
-
-c
编译生成目标文件(Relocatable),详见第18.2节。
-
-Dmacro[=defn]
定义一个宏,详见第20.3节。
-
-dynamic-linker /path/to/dynamic_linker
指定动态链接器的路径,详见第18.2节。
-
-E
只做预处理而不编译,cpp命令也可以达到同样的效果,详见第20.2.1节。
-
-foption
指定一些选项控制生成的代码,比如-fno-common表示生成的代码中没有Common符号,详见第19.2.3节,-fPIC表示生成位置无关代码,详见第19.4节。
-
-g
在生成的目标文件中添加调试信息,所谓调试信息就是源代码和指令之间的对应关系,在gdb调试和objdump反汇编时要用到这些信息,详见第10.1节。如果要编译链接多个目标文件,必须在编译每个目标文件时加-g选项,而不能只在最后链接时加-g选项,详见第19.4节。
-
-Idir
dir是头文件所在的目录,详见第19.2.2节。
-
-lname
链接libname库文件,可能是动态库(例如libname.so)也可能是静态库(例如libname.a),如果动态库和静态库都能找到则优先链接动态库,如果指定了-static选项则只链接静态库,详见第19.3节。
-
-Ldir
dir是库文件所在的目录,详见第19.3节。
-
-M和-MM
输出“.o文件:.c文件.h文件”这种形式的Makefile规则,-MM的输出不包括系统头文件,详见第21.4节。
-
-o outfile
outfile输出文件的文件名,详见第18.2节。
-
-O?
各种编译优化选项,详见第18.6节。
-
-print-search-dirs
打印库文件的默认搜索路径,详见第19.3节。
-
-static
参考上面-lname选项的说明。
-
-std=c99
如果代码中使用了某些C99的新特性,需要用这个选项编译,详见第6.3节。
-
-S
编译生成汇编代码,详见第18.2节。
-
-v
打印详细的编译链接过程,详见第18.2节。
gcc -v main.c -o main
-
-Wall
打印所有的警告信息,详见第1.4节。
-
-Wl,options
options是传递给链接器的选项,详见第19.4节。
-
-
gdb的基本用法
-
在第10章集中介绍了gdb的基本命令和调试方法。
-
在第18.1节提到了gdb的指令级调试和反汇编命令。
-
在第18.6节讲编译优化选项时提到,为调试而编译时不要指定优化选项,否则无法做源码级调试,因为源代码和指令可能对应不上。
-
如果一个程序由多个.c文件编译链接而成,用gdb调试时如何定位某个源文件中的某一行代码呢?在第19.1节有介绍。
-
在第22.6节讲到用gdb调试时如何给程序提供命令行参数。
-
-
其他开发调试工具
-
ar
把目标文件打包成静态库,详见第19.3节。
-
as
汇编器,详见例17.1。
as hello.s -o hello.o
-
hexdump
二进制文件查看工具,以十六进制或ASCII字符显示一个文件,详见第17.5.1节。
hd max.o
-
ld
链接器,详见例17.1,用--verbose选项可以显示默认链接脚本,详见第19.1节。
ld hello.o -o hello
-
ldd
用动态链接器测试一个程序依赖于哪些共享库,并查找这些共享库都在什么路径下,详见第19.4节。
-
make
管理源代码的编译过程,详见第21章。
-
nm
查看符号表,详见第18.2节。
nm /usr/lib/crt1.o
-
objdump
显示目标文件中的信息,在本书中主要用它做反汇编,详见第17.5.1节。
objdump -d max.o objdump -d max objdump -S max
-
od
另一种二进制文件查看工具,以八进制、十六进制或ASCII字符显示一个文件,详见第24.2.1节。
-
ranlib
给ar打包的静态库建索引,详见第19.3节。
-
readelf
读ELF文件信息,详见第17.5.1节。
readelf -a max.o readelf -a max
-
strip
去除可执行文件中的符号信息,详见第17.5.2节。
strip max
-