00. 目錄
01. GNU工具概述
在Linux中,GNU Tools是主要的程序的開發工具,這組工具主要用於生成代碼和分析程序。GNU Tools最重要的組成部分是GCC。GCC是GNU Compiler Collection的縮寫,是一個非常優秀的跨平臺編譯器集合,支持x86、ARM、MIPS和PowerPC等多種目標平臺,支持C、C++、Java、ADA、Fortran和Pascal等多種高級語言。
GCC能完成從C、C++、Objective-C等源文件向運行在特定CPU硬件上的目標代碼的轉換。對於通用計算機、一般使用GCC生成x86的可執行代碼,對於嵌入式開發系統使用交叉編譯GCC,生成目標機可以執行的程序。
02. 常用文本文件
*.c C語言源文件
*.C *.cxx *.cc C++語言源文件
*.i 預處理後的C語言源文件
*.ii 預處理後的C++語言源文件
*.s *.S 彙編語言文件
*.h 頭文件
03. 常用二進制文件
*.o 目標文件
*.so 動態庫
*.a 靜態庫
.c爲後綴的文件,C語言源代碼文件;
.a爲後綴的文件,是由目標文件構成的檔案庫文件;
.C,.cc或.cxx 爲後綴的文件,是C++源代碼文件且必須要經過預處理;
.h爲後綴的文件,是程序所包含的頭文件;
.ii爲後綴的文件,是C++源代碼文件且不應該對其執行預處理;
.m爲後綴的文件,是Objective-C源代碼文件;
.mm爲後綴的文件是Objective-C++源代碼文件;
04. Binutils工具集
GCC是一組工具的集合,包含了預處理器、編譯器、彙編器、連接器部分。當使用GCC的時候,將根據需要調用相應的工具。對於默認的文件名,GCC可以自動選擇工具來完成文件處理過程。從C語言的源程序到可執行文件的轉換,實質上是依靠GCC調用一系列工具完成的。
Binutils是一個二進制工具的集合,包含了彙編、鏈接以及一系列的輔助工具。binutils是輔助GCC的重要工具集,主要包含以下的工具。
as: GNU彙編器,用於將處理器的彙編格式代碼轉換成可執行代碼,並存儲到目標文件.o文件中
ld: GNU連接器,用於將一個或者多個目標文件(.o)、庫組合成一個可執行的程序,或者生成靜態庫或者靜態庫。
ar: 歸檔工具,可以將多個文件組合成一個大文件,並且可以讀取原始文件的內容
strip: 去除文件中的符號
nm: 可以i顯示目標文件中的符號
objcopy: 轉換二進制代碼的工具,可以將二進制代碼轉換成各種格式
objdump: 顯示目標文件的反彙編工具
readelf: 顯示ELF文件的各種信息
strings: 顯示文件中可打印字符
ranlib: 產生歸檔文件的索引,並將其保存到歸檔文件中。
addr2line: 可以將一個可執行程序的地址映射到源文件的對應的行
gprof: 顯示程序調用段的各種信息。
05. GCC工具
5.1 gcc用法參考
[root@deng test]# gcc --help
用法:gcc [選項] 文件...
選項:
-pass-exit-codes 在某一階段退出時返回最高的錯誤碼
--help 顯示此幫助說明
--target-help 顯示目標機器特定的命令行選項
(使用‘-v --help’顯示子進程的命令行參數)
-dumpspecs 顯示所有內建 spec 字符串
-dumpversion 顯示編譯器的版本號
-dumpmachine 顯示編譯器的目標處理器
-print-search-dirs 顯示編譯器的搜索路徑
-print-libgcc-file-name 顯示編譯器伴隨庫的名稱
-print-file-name=<庫> 顯示 <庫> 的完整路徑
-print-prog-name=<程序> 顯示編譯器組件 <程序> 的完整路徑
-print-multi-directory 顯示不同版本 libgcc 的根目錄
-print-multi-lib 顯示命令行選項和多個版本庫搜索路徑間的映射
-print-multi-os-directory 顯示操作系統庫的相對路徑
-Wa,<選項> 將逗號分隔的 <選項> 傳遞給彙編器
-Wp,<選項> 將逗號分隔的 <選項> 傳遞給預處理器
-Wl,<選項> 將逗號分隔的 <選項> 傳遞給鏈接器
-Xassembler <參數> 將 <參數> 傳遞給彙編器
-Xpreprocessor <參數> 將 <參數> 傳遞給預處理器
-Xlinker <參數> 將 <參數> 傳遞給鏈接器
-combine 將多個源文件一次性傳遞給彙編器
-save-temps 不刪除中間文件
-pipe 使用管道代替臨時文件
-time 爲每個子進程計時
-specs=<文件> 用 <文件> 的內容覆蓋內建的 specs 文件
-std=<標準> 指定輸入源文件遵循的標準
--sysroot=<目錄> 將 <目錄> 作爲頭文件和庫文件的根目錄
-B <目錄> 將 <目錄> 添加到編譯器的搜索路徑中
-b <機器> 爲 gcc 指定目標機器(如果有安裝)
-V <版本> 運行指定版本的 gcc(如果有安裝)
-v 顯示編譯器調用的程序
-### 與 -v 類似,但選項被引號括住,並且不執行命令
-E 僅作預處理,不進行編譯、彙編和鏈接
-S 編譯到彙編語言,不進行彙編和鏈接
-c 編譯、彙編到目標代碼,不進行鏈接
-o <文件> 輸出到 <文件>
-x <語言> 指定其後輸入文件的語言
允許的語言包括:c c++ assembler none
‘none’意味着恢復默認行爲,即根據文件的擴展名猜測
源文件的語言
-w 不顯示警告信息
-W 指定需要顯示的警告信息
-Wall 表示顯示所有的警告信息
-Werr 將警告信息當成錯誤、並終止編譯
-DMACRO 定義宏MACRO爲字符串1
-DMACRO=DEF 定義MACRO宏爲字符串DEF
-UMACRO 取消對MACRO宏的定義
-ggdb 生成可被gdb使用的標準調試信息
-mXXX 針對XXX CPU進行優化,例如XXX可以是486 586等
-O0 不進行代碼優化
-O或者-O1 進行一般的代碼優化,減少執行代碼大小和執行的時間
-O2 比-O1進行更多的優化,減少執行代碼大小和執行的時間
-O3 比-O2更進一步優化
-MM 輸出源文件的依賴關係
-ansi 編譯器將所有的gnu的編譯器特性都關掉,可以讓程序和Ansi標準兼容
-include file 編譯之前將file包含進去,相當於在所有編譯的源文件最前面加入include <file>語句
-imacros file 與-include file一樣,不過這個文件在具體編譯的時候只有裏面定義的宏才起作用,
所以只用來在file文件中定義宏
-nostdinc 在搜尋include的文件路徑中去掉標準的C語言頭文件搜索路徑,例如stdin.h文件
就是放在標準頭文件搜索路徑下。
-C 通-E參數配合使用,讓預處理後的結果保留註釋,一遍程序更易讀。
-nostartfiles 在鏈接的時候不把系統相關的啓動代碼鏈接起來
-nostdlib 在鏈接的時候不把標準庫鏈接進來
以 -g、-f、-m、-O、-W 或 --param 開頭的選項將由 gcc 自動傳遞給其調用的
不同子進程。若要向這些進程傳遞其他選項,必須使用 -W<字母> 選項。
5.2 參考示例
[root@deng test]# ls
a.out main.c myputs.c myputs.h test.c test.h
[root@deng test]# gcc -pipe -g -Wall -I. -c test.c -o test.o
[root@deng test]#
#解釋
-g: 表示含有調試信息
-Wall: 表示輸出所有的警告
-I. 表示包含當前目錄作爲頭文件搜索路徑,這個選項用於增加搜索頭文件的路徑
-pipe: 表示使用管道替換臨時文件
-o: 指定輸出地目標文件的名稱