# 第?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
- 參考書目
- 索引