Skip to content

Latest commit

 

History

History
178 lines (99 loc) · 4.56 KB

summary.md

File metadata and controls

178 lines (99 loc) · 4.56 KB

本阶段总结

在这一阶段我们又学习了很多新的语法规则,首先读者应该回到上篇的阶段总结把那些知识点重新总结一遍。然后我们总结一下各种开发调试工具的用法。

  1. 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节。

  2. gdb的基本用法

    • 在第10章集中介绍了gdb的基本命令和调试方法。

    • 在第18.1节提到了gdb的指令级调试和反汇编命令。

    • 在第18.6节讲编译优化选项时提到,为调试而编译时不要指定优化选项,否则无法做源码级调试,因为源代码和指令可能对应不上。

    • 如果一个程序由多个.c文件编译链接而成,用gdb调试时如何定位某个源文件中的某一行代码呢?在第19.1节有介绍。

    • 在第22.6节讲到用gdb调试时如何给程序提供命令行参数。

  3. 其他开发调试工具

    • 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