分类: 嵌入式
2012-02-22 15:37:01
GNU 開發工具是由 GNU 組織所設計的,包含 gcc 編譯器、as 組譯器、ld 連結器,make 專案建置工具等。這些工具已廣泛地被使用於系統程式的開發上,甚至,著名的 Linux 作業系統也是用 GNU 工具所開發完成的。
GNU 工具的應用相當廣泛, 在 Linux 作業系統中通常預設就安裝了GNU 工具。在 Windows 系統中,您可以安裝 Dev C++ 或 Cygwin 等軟體,以便使用 GNU 工具。本書的示範將以 Dev C++ 環境為主,但由於 Dev C++ 中的 GNU 工具不支援某些函式庫,特別是像是 fork() 與 thread 等行程管理函數。因此在必要的時候,可以在 PC 當中安裝 Cygwin 環境,這會讓您的 Windows 系統下擁有相當接近 Linux 的開發環境。
GNU 程式集包含許多工具程式,像是 gcc, as, ld, ar, nm, objdump, objcopy, strip, strings, ltrace 等工具, 這些工具的基本用法如表格一所示。
表格一、GNU 工具程式及其用法
工具 | 工具類型 | 全名 | 使用範例 | 使用說明 |
gcc | C 語言編譯器 | GNU C Compiler | gcc hello.c -o hello.o | 將 hello.c 編譯成 hello.o |
as | 組譯器 | Assembler | as hello.s -o hello.o | 將 hello.s 組譯為 hello.o |
ld | 連結器 | Linker | ld -o abc.o a.o b.o c.o | 將 a.o, b.o, c.o 連結成執行檔 abc.o |
ar | 函式庫製作 | Archive | ar -r libabc.a a.o b.o c.o | 將 a.o, b.o, c.o 包裝成函數庫 libabc.a |
nm | 符號表檢視 | name mangling | nm hello.o | 印出 hello.o 目標檔的符號表 |
objdump | 目標檔傾印 | Object File Dump | objdump -x hello.o | 查看目標檔 hello.o 的詳細資訊 |
objcopy | 目標檔複製 | Object File Copy | objcopy -O binary hello.elf hello.bin | 將 elf 檔轉換為 binary 檔 |
strip | 去除除錯資訊 | Strip | strip a.o | 把 a.o 當中的符號表與除錯資訊去除 |
strings | 字串表傾印 | strings dump | strings a.o | 觀看 a.o 檔中的字串表 |
ltrace | 函數路徑追蹤 | line trace | ltrace a.o | 追蹤 a.o 的函數呼叫路徑 |
在系統程式領域,微軟與 GNU 是兩個最常被使用到的開發工具,微軟的工具以 Visual Studio 為主,而 GNU 工具則以 gcc 為核心。
『GNU 開發工具』與『Visual Studio』都可以用作 C/C++ 與組合語言的開發工具,兩者各有優缺點。GNU工具的優點是短小精悍、支援平台眾多、而且開放原始碼。而Visual Studio 的優點是開發環境完整、視覺化開發介面優良、並且與微軟的 Windows 密切整合。
下表是微軟與 GNU 兩者的工具比較表,如果要執行這些微軟程式,最簡單的方法是於 Windows 中安裝 Visual Studio,然後開啟 Visual Studio 的命令列即可使用之。若要執行這些 GNU 工具,則可於 Windows 中安裝 Cygwin 或 MinGW 等 GNU 環境,或者安裝 Dev C++ 後就會自動具備 MinGW 環境,然後於環境變數 PATH 中加入這些工具的所在路徑即可。
工具 | 微軟 | GNU |
C編譯器 | cl | gcc |
組譯器 | ml | as |
連結器 | link | ld |
專案建制器 | nmake | make |
函式庫建構 | lib | ar |
目的檔傾印 | dumpbin | objdump |
GNU 與微軟的工具在設計上有點不同,但所具有的功能都相當類似,舉例而言,下表顯示了兩者在組譯與編譯器參數上的不同用法,其中微軟的組合語言附檔名通常為 *.asm,但 GNU 的則為 *.s。要將 C 語言轉為組合語言,在微軟工具中可使用 cl /Fa
組合語言工具 | 微軟 | GNU |
組譯器 | ml 範例:ml sum.asm | as 範例:as sum.s |
C 編譯器 (轉組合語言) | cl 範例:cl /Fasum.asm sum.c | gcc 範例:gcc -S sum.c -o sum.s |
雖然微軟與 GNU 工具兩者在設計上稍有不同,但是對系統程式設計師而言,重要的是使用工具的能力,以及程式的基本概念。有了這些核心概念後,就能兵來將擋,水來土淹,達到一通百通的境界。