Part 1 – Introduction to GNU C/C++ compiler and binutils
Step 1: understand GNU binutils
The GNU Binutils are a collection of binary tools. The main ones are:
--ld - the GNU linker.
--as - the GNU assembler.

But they also include:
addr2line: 可將內含除錯資訊的程式中某個特定位址轉換為其原始程式碼的檔名以 及行號,其功能有點像除錯器 。
ar: 可將許多檔案打包成一個單一包裹檔案,同時也可以進行包裹檔的修改、資料 節取、刪除 .... 等等的管理工作。它最常被拿來製作靜態函式庫 (static library),也就是將原始程式碼經由編譯器編譯出一個個目的檔後,就可以 使用 ar 程式將這些目的檔全部打包起來,而這個打包出來的檔案就是一個 靜態函式庫,通常其副檔案即為 .a。
c++filt: 由於 C++ 語言可以藉由函式 overload 的方式,讓許多不同的函式使用 相同的函式名,而這些不同的函式在編譯過後就以不同的組合標記 (assembly label) 來表示,此對應過程稱之為 mangling。而工具程式 c++filt 所做的 卻是相反的動作: 它可以由組合標記反向對應出其原來的函式名稱,以便連結 器參考使用,而此反向過程即稱之為 demangling。
gprof: 用來顯示程式的效率測試資訊 (profiling)。通常在我們要試圖提升程式的 執行效能時,我們必須要先知道程式的各部分到底花了多少時間來執行,如此 我們心裡才能有個底,知道應該由那些部分先下手改進。然而,光從程式碼本 身有時候很難評估到底那個部分最花時間,這時就可以靠這個工具程式幫忙了。 在測示前,首先必須在程式編譯時加入效率測試資訊 (以 GCC 為例,編譯時必 須加入 -pg 的參數),之後當我們執行程式之後,就會跑出一個 gmon.out 的 檔案,該檔案即內含了效率測試的結果,但它的格式是不可讀的,這時就必須 用 gprof 將它讀出來。
nlmconv: 此工具程式可以將目的檔轉換成 NLM (NetWare Loadable Module) 的格式。
nm: 此工具程式可以列出目的檔或函式庫中內含的物件名稱,包括所有的函式名稱與 全域變數的名稱 .... 等。
objcopy: 此工具程式可以拷備、轉換不同格式的目的檔。
objdump: 此工具程式可以列出目的檔內含的資訊。
ranlib: 此工具程式可以產生包裹檔的內容索引,並加入該包裹檔中。此包裹檔即為 ar 程式所產生的包裹檔。通常在產生靜態函式庫時需要用到它。等同 ar-s
readelf: 此工具程式可以顯示 ELF 格式的目的檔內含的資訊。
相關用法 請參考 ELF 之 Program Loading 教學文件
size: 此工具程式可以列出目的檔或包裹檔中各節區的大小。
strings: 此工具程式可以列出檔案中任何可印出的字串。
strip: 此工具程式可以將目的檔或可執行檔中不必要的標記與資訊抽離,讓該目的 檔或可執行檔的大小縮小。這些可抽離的資訊通常是除錯資訊以及其他的符號 標記。
14. as 編譯由gcc所輸出的彙編檔(*.s) 產生目標檔(*.o)
ex: gcc -S hello.c ==> hello.s
as -o hello.o hello.s ==> hello.o
效果等同 gcc -c hello.c

Binutils 已經被移植到許多不同的硬體平台上,它同時也具有易於移植到其他平
台的特性,因此,非常適合用於嵌入式系統的開發。

Step 2: understand GNU C/C++ compiler (GCC)
GNU 有許多成名之作,其中最重要的軟體之一就是GCC,GCC 最早由Richard
Stallman 所發展,因為它是免費使用且原始碼公開,所以發展的相當迅速,很快
就有許多人將它移植到不同的平台上。GCC 廣受歡迎的另一個原因是它所編譯
出來的程式碼的品質(程式碼的正確性、大小、執行速度等等)並不比一些其他
的商用編譯器來的差,有時甚至比較好,因此常常看到許多平台上都有GCC 的
蹤影。
GCC 提供一套方便的機制,使你可以很容易的將它移植到另一個平台,同時也
可以利用它來做為其他語言的前端,到目前為止,它所支援的程式語言有C、
C++、Objective C、Fortran、Java、Pascal、Ada、Modula-3、Java 等等。選擇
GCC 來開發compiler,是因為它免費可以取得,同時又支援許多平台和處理器,
它結構化的設計使得我們可以很容易將它移植到另一個平台上,符合我們快速產
生目的程式碼的需求,下圖顯示GCC 的內部架構。

在GCC 的編譯過程中,Parsing 負責分析輸入的原始程式產生Parsing tree,透過
Tree traveling 產生中間碼RTL(register transfer language),接著GCC 讀取
Machine Description 利用pattern match 的方式去match RTL 藉此產生assembler
code,在此過程中,GCC 會使用不同的最佳化方法去最佳化RTL 和產生
assembler code。

Step 3: cross toolchains
由於嵌入式系統先天上的限制(有限的記憶體大小、處理器的效能、系統可能沒
有螢幕顯示相關訊息等等),在嵌入式系統內執行compiler、assembler 等開發工
具有時是不可能的。因此,軟體開發工具必須能提供跨平台編譯的功能,才能符
合實際的需求。
Cross toolchains 有幾個專有名詞,必須瞭解:
--Build machine:the machine builds cross toolchains
--Host machine:the machine cross toolchains will execute on
--Target machine:the machine cross toolchains will produce outputs for
GNU toolchains 使用三個欄位(CPU type–Company name–System type)來設定
machine:
--CPU type
--Company name
--System type
--For example:vax-dec-ultrix4.2、i386-redhat-linux、m68k-coff、arm-elf

Step 4: cross newlib
在撰寫程式的過程中,通常都會使用C standard library,GNU newlib project 提供
了適用於嵌入式系統的C standard library,讓整個發展環境更為完整。
Part 2 – Build cross binutils to arm linux
直接抓arm linux toolchain 檔 解壓
arm-linux-toolchain.tgz
tar -zxvf arm-linux-toolchain.tgz
mv $PWD/arm /usr/local/arm
再增加 PATH
PATH=$PATH:/usr/local/arm/2.95.3/bin
Part 3 – Build cross binutils to FC6
Step 1 下載GCC及Binutils的原始碼
GCC :
ftp://ftp.nctu.edu.tw/computer-languages/C/gcc/releases/gcc-3.4.3/gcc-3.4.3.tar.gz
Binutils :
ftp://ftp.nctu.edu.tw/UNIX/gnu/binutils/binutils-2.14.tar.gz
Newlib :
ftp://sources.redhat.com/pub/newlib/newlib-1.13.0.tar.gz
Step 2 設定環境變數及建立暫存目錄
$ cd
$ mkdir build-binutils
$ mkdir build-gcc
$ mkdir build-newlib
$ mkdir install
$ export TARGET=arm-elf
$ export PREFIX=`pwd`/install
$ export PATH=$PATH:$PREFIX/bin
Step 3 安裝binutils
(1) 將binutils-2.14.tar.gz解壓縮。
$ tar zxvf binutils-2.14.tar.gz
(2) 編譯binutils。
$ cd build-binutils
$ ../binutils-2.14/configure --target=$TARGET --prefix=$PREFIX
$ make all install
$ cd ..
Step 4 安裝bootstrap GCC (用來編譯newlib)
(1) 將gcc-3.4.3.tar.gz解壓縮
$ tar zxvf gcc-3.4.3.tar.gz
(2) 編譯gcc
$ cd build-gcc
$ ../gcc-3.4.3/configure --target=$TARGET --prefix=$PREFIX \
--with-newlib --without-headers --with-gnu-as \
--with-gnu-ld --disable-shared --enable-languages=c
$ make all-gcc install
$ cd ..
Step 5 安裝newlib C runtime library
(1) 編譯newlib
$ cd build-newlib
$ ../newlib-1.13.0/configure --target=$TARGET --prefix=$PREFIX
$ make all install
$ cd ..
Step 6 安裝完整的Cross compiler
(1) 清空暫存目錄
$ cd build-gcc
$ rm -rf *
(2) 編譯compiler
$ ../gcc-3.4.3/configure --target=$TARGET –prefix=$PREFIX \
--with-gnu-as --with-gnu-ld --enable-languages=c
$ make all install
$ cd
或者你可以直接用yum安裝
yum search binutils
binutils.i386 2.17.50.0.6-2.fc6 installed
Matched from:
binutils
Binutils 是套 binary 的工具,包含了 ar (用來
建立,修改以及從 archives 中擷取),as (GNU
assemblers 的家族之一),gprof (用來顯示 call graph 的檔案資料),ld
(GNU linker),nm (用來從物件檔案列出符號),objcopy (用來
複製與編譯物件檔案),objdump (用來顯示
物件檔案的資訊),ranlib (用來產生一個 archive 內容的
索引),size (用來列出一個物件或 archive 檔案的
區段大小),strings (用來列出檔案中可列印的
字串),strip (用來拋棄符號) 與 addr2line (用來轉換
位址為檔案與行列)。
若沒安裝 直接 yum install binutils.i386
yum search gcc
gcc.i386 4.1.1-51.fc6 installed
Matched from:
gcc
這個 gcc 套件包含了 GNU Compiler Collection verion 4.1。
要編譯 C 語言程式碼,您需要這個套件
若沒安裝 直接 yum install gcc.i386

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()