Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52864
  • 博文数量: 53
  • 博客积分: 752
  • 博客等级: 军士长
  • 技术积分: 450
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-17 11:46
文章分类

全部博文(53)

文章存档

2015年(1)

2014年(1)

2013年(11)

2012年(21)

2011年(19)

我的朋友

分类: 嵌入式

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 工具程式及其用法

工具工具類型全名使用範例使用說明
gccC 語言編譯器GNU C Compilergcc hello.c -o hello.o將 hello.c 編譯成 hello.o
as組譯器Assembleras hello.s -o hello.o將 hello.s 組譯為 hello.o
ld連結器Linkerld -o abc.o a.o b.o c.o將 a.o, b.o, c.o 連結成執行檔 abc.o
ar函式庫製作Archivear -r libabc.a a.o b.o c.o將 a.o, b.o, c.o 包裝成函數庫 libabc.a
nm符號表檢視name manglingnm hello.o印出 hello.o 目標檔的符號表
objdump目標檔傾印Object File Dumpobjdump -x hello.o查看目標檔 hello.o 的詳細資訊
objcopy目標檔複製Object File Copyobjcopy -O binary hello.elf hello.bin將 elf 檔轉換為 binary 檔
strip去除除錯資訊Stripstrip a.o把 a.o 當中的符號表與除錯資訊去除
strings字串表傾印strings dumpstrings a.o觀看 a.o 檔中的字串表
ltrace函數路徑追蹤line traceltrace 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編譯器clgcc
組譯器mlas
連結器linkld
專案建制器nmakemake
函式庫建構libar
目的檔傾印dumpbinobjdump

GNU 與微軟的工具在設計上有點不同,但所具有的功能都相當類似,舉例而言,下表顯示了兩者在組譯與編譯器參數上的不同用法,其中微軟的組合語言附檔名通常為 *.asm,但 GNU 的則為 *.s。要將 C 語言轉為組合語言,在微軟工具中可使用 cl /Fa 的指令,但在 GNU 工具中則需使用 gcc -S -o

組合語言工具微軟GNU
組譯器ml 範例:ml sum.asmas 範例:as sum.s
C 編譯器 (轉組合語言)cl 範例:cl /Fasum.asm sum.cgcc 範例:gcc -S sum.c -o sum.s

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

阅读(2233) | 评论(0) | 转发(1) |
0

上一篇:交叉编译 linux

下一篇:人生是场冒险

给主人留下些什么吧!~~