GNU 工具簡介

GNU 程式設計

GNU 程式簡介

GNU 與 C 語言

gcc 編譯器

glibc 函式庫

make 建置

ld 連結器

as 組譯器

ar 函式庫

objdump

objcopy

訊息

相關網站

參考文獻

最新修改

簡體版

English

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 與微軟的比較

在系統程式領域,微軟與 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<fileName.asm> 的指令,但在 GNU 工具中則需使用 gcc -S <fileName.c> -o <fileName.s>。

組合語言工具 微軟 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 工具兩者在設計上稍有不同,但是對系統程式設計師而言,重要的是使用工具的能力,以及程式的基本概念。有了這些核心概念後,就能兵來將擋,水來土淹,達到一通百通的境界。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License