GNU 工具與 Cygwin 開發環境

GNU 程式設計

GNU 程式簡介

GNU 與 C 語言

gcc 編譯器

glibc 函式庫

make 建置

ld 連結器

as 組譯器

ar 函式庫

objdump

objcopy

訊息

相關網站

參考文獻

最新修改

簡體版

English

GNU 系統開發工具

GNU 開發工具是由 GNU 組織所設計的,包含 gcc 編譯器、as 組譯器、ld 連結器,make 專案建置工具等。這些工具已廣泛被使用於系統程式的開發上,甚至,著名的 Linux 作業系統也是用 GNU 工具所開發完成的。

GNU 工具支援許多種類的 CPU,包含 Intel 的80x86、Motorola 的 68000,ARM、MIPS等數十種處理器,因此也廣泛被使用於嵌入式系統的開發上,在嵌入式系統的市場有極高的佔有率。

GNU工具的原始程式碼,幾乎都是使用 C 語言所撰寫,因此,熟悉 C 語言的人可以很容易的取得程式碼並閱讀之,這也與本書使用 C 語言作為範例的立場一致,也是我們採用 GNU 工具的原因之一。

GNU 開發工具採用開放原始碼的 GPL授權,原始程式碼完全開放,因此,若想進一步理解其運作原理,或者修改後重新編譯使用,只要按照 GPL授權釋出原始程式碼即可,這提供了學習者一個很好的學習管道,能更進一步學習這些工具背後的原理。

更棒的是,由於GNU 工具乃是 Linux 作業系統的主要開發工具,Linux 的整個系統都建構在 GNU 開發工具上。因此,透過 GNU 工具,我們得以深入實務領域,並且銜接上『嵌入式系統』與『作業系統』等課程。另外,透過 GNU 的開放原始碼,讓讀者於有疑問或想進一步研究時可以取得原始碼直接閱讀,這是其他商業性開發工具所難以提供的。

GNU開發環境的安裝

在 Linux 當中,預設就包含了GNU 工具,因此,若您所使用的作業系統是 Linux,那不需要特別的安裝,預設就會包含 gcc, as, ld, make 等開發工具,使用相當簡便。

在 Microsoft Windows 作業系統當中,要使用 GNU 開發工具也很容易,Cygwin 與 Mingw 是兩種常見的 gcc 環境,您可以安裝其中一種,就能輕易的編譯C語言及組合語言。

Mingw 與 Cygwin 兩種環境具有相反的設計哲學,Mingw 是Minimalist GNU for Windows 的縮寫,該軟體主要是將 GNU 工具移植到 MS. Windows 平台,直接連接上 MS. Windows 的底層函式庫。此種作法的執行速度較快,但是與Linux 的互通性則較差。

Cygwin 則是 Cygnus 公司所建立的,Cygwin的名稱來來自於 GNU + Cygnus + Windows 的縮寫。Cygwin環境的目標則是在 MS. Windows 底下建立起一個模仿 Linux 的環境,然後才將 Linux 環境中的程式整個移植到 MS. Windows 當中。此種作法的執行速度較慢,但是與 Linux 的互通性會較好。

要安裝 Mingw 環境,最簡單的方法是安裝 Dev C++,對於學過C語言的學生而言,Dev C++是經常被使用到的開發工具,該軟體其實是搭配Mingw環境所建構而成的,當您安裝了Dev C++ 之後,可以在其安裝錄徑下找到 Mingw 版本的 gcc與 ld 等 GNU 工具。舉例而言,筆者的這些工具位於C:\Dev-Cpp\bin 這個資料夾底下。您可以於 Windows 系統環境中的 PATH 變數加入該路徑,就能在命令列中執行 gcc 等指令。

Cygwin開發環境的安裝

安裝 Cygwin 開發環境相當簡單,您可以從 http://www.cygwin.com/ 網站上按下Install Cygwin now 的連結,即可安裝此一開發環境,

安裝 Cygwin 這套軟體時,請確認是否勾選了All/Devel/{gcc、binutils、make} 等選項,如圖 1 所示。如此,即可在 Window 當中以 GNU工具開發 C 語言與組合語言程式,其用法與 Linux 當中幾乎大部分都相同,本書中的範例也都可以在 Cygwin 上執行。

CygwinInstall1.jpg

圖 1 開發環境 Cygwin 安裝時,請確認勾選了 gcc, make, binutils 等三個選項

對於 Linux 的使用者而言,通常都很熟悉其命令列 (Shell) 的操作,因此,我們將不多作解說,然而,對於原本熟悉 Microsoft Windows 的讀者,我們將透過本節的介紹,導引讀者進入 Cygwin 的命令列操作環境,使讀者能在後續的章節中,使用 GNU 工具時能更快速的理解,而不需花費太多時間熟悉使用環境。

若您使用的是 Microsoft Windows 作業系統,則請先安裝 Cygwin 軟體環境後,選取『開始/所有程式/Cygwin/Cygwin Bash Shell』項目,以啟動 Cygwin 的命令列環境,接著,會顯示出如圖 2 的命令列視窗。

CygwinStart.jpg

圖 2 Cygwin 開發環境的初始進入畫面

在安裝完 Cygwin 環境之後,您就可以開始使用 GNU 工具了,在本節中,我們將先介紹 gcc 編譯器的基本用法,然後在第8章的編譯器中會介紹其深入的用法。GNU工具中除了 gcc 編譯器之外,還有許多其他的工具,像是連結、目的檔工具等,這些工具的用法請參考附錄C。建議讀者先閱讀完附錄C之後,再回到此處繼續閱讀。

以下我們將使用 Cygwin 開發環境作為範例,介紹 GNU 工具的使用方法,利用範例導向的方式,導引讀者熟悉GNU 工具的操作。圖 3,顯示了GNU工具使用的基本流程。

GnuToolsFlowChart.jpg

圖 3 GNU工具使用的基本流程

首先,請讀者撰寫如範例 1 兩個C語言程式 main.c 與 sum.c。

範例 1. C 語言程式 - main.c 與 sum.c

// C 語言主程式 (main.c)
#include <stdio.h>
int main(void) {
int sum1 = sum(10);
printf("sum=%d", sum1);
return 1;
}

// C 語言函數 (sum.c)
int sum(int n) {
int s=0;
int i;
for (i=1; i<=n;i++) {
s = s + i;
}
return s;
}

接著,您可以使用 GNU 的 gcc 工具對這些檔案進行編譯連結,直接產生執行檔。

範例 2. 利用 gcc同時編譯 main.c 與 sum.c 並輸出執行檔

$gcc main.c sum.c –o sum.o
$./sum.o
sum=55

在範例 2 中,所產生的執行檔名稱為 sum,在 Gygwin 的環境中,其輸出檔案名稱為 sum.exe,而在 Linux 中,其輸出檔案名稱為 sum.o。

請注意,在 Linux 與 Cygwin 的環境下,要執行一個執行檔,例如像 Linux 下的 sum.o 或 Cygwin 下的 sum.exe,您必須於檔名前面加上 『./』 符號,這是沿襲 Linux 中的慣例。因此,在上述範例的第二行指令中,我們使用 ./sum 語法以執行輸出檔,而非像在 DOS 中,直接輸入 sum 命令,這是 Cygwin 的初學者常會碰到的一個問題。

接著,我們將示範如何用 gcc 將 C 語言編譯後轉換為組合語言。這可利用 gcc 中的 –S 參數完成,參數 –S 用來告訴 gcc 產生組合語言而非執行檔。如此,有利於我們觀察 C 語言與組合語言之間的對照關係。例如,以下兩個指令可以分別 sum.c 與 main.c 程式轉換為組合語言。

gcc -S sum.c -o sum.s
gcc -S main.c -o main.s

gcc 雖然是個編譯器,但是也可以被用來當成組譯器使用,因此,我們可以利用gcc 編譯器來『組譯』組合語言程式,在圖 1.6中,我們示範了如何利用 gcc 當作組譯器,將 sum.s 與main.s兩個組合語言程式,直接組譯後連結成執行檔 sum2 。

將 gcc 當成組譯器使用

$gcc -S sum.c -o sum.s
$gcc -S main.c -o main.s
$gcc main.s sum.s –o sum2
$./sum2
sum=55

除了當組譯器使用之外,gcc 更能將 C 語言與組合語言檔混合輸入,然後,編譯、組譯、連結一次完成,在圖 1.7中,我們將示範如何利用 gcc 同時編譯 C 語言檔 main.c 與組合語言檔 sum.s,然後產生執行檔 sum3 。

圖 1.7 利用 gcc 編譯 C 語言 main.c 同時組譯組合語言 sum.s

$gcc main.c sum.s –o sum3

$./sum3
sum=55

在本節中,我們介紹了 gcc 的一些基礎用法,然而,gcc 是一套強大而複雜的編譯器,其詳細用法無法在此盡列,有興趣的讀者可參考本書附錄中的 gcc 用法一節,有較詳細的參數與用法描述,對於須更詳細的瞭解 gcc 的讀者而言,可參考網路上的 gcc 資源 與 gcc 的官方指南 。

Facebook

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