要完成uclinux在ARM上的移植,必須有這個工具。
下載地址:
http://opensrc.sec.samsung.com/download.html 這個網站上還有許多其它資源可以下載。
我選擇 arm-elf-tools-20040427.sh 這個版本,大小是16.8M,電信2M帶寬,用FIREFOX自帶下載工具下載速度爲110K左右,速度還是挺快的。
安裝過程:
1、看這個文件的屬性
ls -l arm-elf-tools-*
2、修改屬性
chmod 755 arm-elf-tools*
3、執行解壓安裝
如在ubuntu下必須sudo ,其它版linux下,要用root。
sudo sh ./arm-elf-tools-20040427.sh
一般情況下,會提示以下錯誤:
#################################
#tail: cannot open `+43' for reading: No such file or directory
#
#gzip: stdin: not in gzip format
#tar: This does not look like a tar archive
#tar: Error exit delayed from previous errors
#################################
解決方法:
*tail問題:tail: cannot open `+43' for reading: No such file or directory
用VIM打開該文件,將第39行的代碼:
tail +${SKIP} ${SCRIPT} | gunzip | tar xvf -
改成如下:
tail -n +${SKIP} ${SCRIPT} | gunzip | tar xvf -
vim arm-elf-tools*
鍵入:I ,進入插入模式
在第39行加入 “-n”
*gunzip問題:gunzip: stdin: unexpected end of file
要在arm-elf-tools-20030314.sh 最後一行加入一空行:完成上面第一個tail問題後,按'ESC',進入命令模式,鍵入‘G’,跳到文章最後,鍵入‘I’,在最後一行尾加回車。
重新執行sudo sh ./arm-elf*.sh命令後,可以發現已經裝好了。可以測試一下:
arm-elf-gcc -v
顯示:
Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specs
gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)
4、測試下編譯器
先寫一個小程序:
/*test.c*/
#include
int main()
{
int i;
for(i=0;i<6;i++)
{
printf("i=%d/n",i);
printf("Hello,embedded linux!/n");
}
return 0;
}
終端下輸入命令:arm-elf-gcc -WI,elf2flt -o test test.c
提示:cc1: Invalid option `-WI,-elf2flt'
還沒有找到解決方法,慢慢來,後面寫。
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
一些編譯器相關知識學習。
GNU GCC簡介:
GNU GCC是一套面向嵌入式領域的交叉編譯工具,支持多種編程語言、多種優化選項並且能夠支持分步編譯、支持多種反彙編方式、支持多種調試信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多種CPU。
GNU GCC的基本功能包括:輸出預處理後的C/C++源程序(展開頭文件和替換宏)
輸出C/C++源程序的彙編代碼
輸出二進制目標文件
生成靜態庫
生成可執行程序
轉換文件格式
GCC 組成:
1. C/C++交叉編譯器arm-elf-gcc
arm-elf-gcc是編譯的前端程序,它通過調用其他程序來實現將程序源文件編譯成目標文件的功能。
編譯時,它首先調用預處理程序(cpp)對輸入的源程序進行處理,然後調用 cc1 將預處理後的程序編譯成彙編代碼,最後由arm-elf-as將彙編代碼編譯成目標代碼。
arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足用戶的各種編譯需求。
2. 彙編器 arm-elf-as
arm-elf-as將彙編語言程序轉換爲ELF (Executable and Linking Format,執行時鏈接文件格式)格式的可重定位目標代碼,這些目標代碼同其它目標模塊或函數庫易於定位和鏈接。
arm-elf-as產生一個交叉參考表和一個標準的符號表,產生的代碼和數據能夠放在多個區 (Section)中。
3. 連接器arm-elf-ld
arm-elf-ld根據鏈接定位文件Linkcmds中的代碼區、數據區、BSS區和棧區等定位信息,將可重定位的目標模塊鏈接成一個單一的、絕對定位的目標程序。
該目標程序是ELF格式,並且可以包含調試信息。
arm-elf-ld會產生一個內存映象文件Map.txt,該文件顯示所有目標模塊、區和符號的絕對定位地址。它也產生交叉參考列表,顯示參考每個全局符號的目標模塊。
arm-elf-ld支持將多個目標模塊鏈接成一個單一的、絕對定位的目標程序,也能夠依此對目標模塊進行鏈接,這個特性稱爲增量鏈接(Incremental Linking)。
假如輸入文件是一個函數庫,arm-elf-ld會自動從函數庫裝載被其它目標模塊參考的函數模塊。arm-elf-ld與其它鏈接程序相比,能提供更有 幫助的診斷信息。許多鏈接器遇到第一個錯誤即放棄鏈接,而arm-elf-ld只要有可能都繼續執行,幫助用戶識別其它錯誤,有時甚至能獲得輸出代碼。
4. 庫管理器arm-elf-ar
arm-elf-ar將多個可重定位的目標模塊歸檔爲一個函數庫文件。採用函數庫文件,應用程序能夠從該文件中自動裝載要參考的函數模塊,同時將應用程序 中頻繁調用的函數放入函數庫文件中,易於應用程序的開發管理。arm-elf-ar支持ELF格式的函數庫文件.
5. 工程管理器MAKE
Make是用於自動編譯、鏈接程序的實用工具,使用make後就不需要手工的編譯每個程序文件。要使用make,首先要編寫makefile。
Makefile描述程序文件之間的依賴關係,並提供更新文件的命令。在一個程序中,可執行文件依賴於目標文件,而目標文件依賴於源文件。如果 makefile文件存在,每次修改完源程序後,用戶通常所需要做的事情就是在命令行敲入“make”,然後所有的事情都由make來完成。
6. 其他實用程序
目標文件格式轉換工具arm-elf-objcopy支持的文件格式有H-record、S-record、ABS、BIN、COFF、ELF。例如,它 能夠將ELF格式文件轉換爲其它格式的文件,如intel H-record格式、Motorola S-record等。arm-elf-nm程序用於顯示文件中的符號信息。
GCC編譯程序的基本過程:
arm-elf-gcc根據輸入文件的後綴來確定文件的類型,然後根據用戶的編譯選項(包括優化選項、調試信息選項等)將其編譯成相應的彙編臨時文件(後綴爲.s);
arm-elf-as將該彙編文件編譯成目標文件(後綴爲.o);
arm-elf-ld 根據用戶的鏈接選項(包括指定鏈接命令文件等)將目標文件和各種庫鏈接起來生成可執行文件。
C/C++交叉編譯器arm-elf-gcc
arm-elf-gcc是編譯的前端程序,它通過調用其他程序來實現將程序源文件編譯成目標文件。
編譯時它首先調用預處理程序(cpp)對輸入的源程序進行處理;然後調用cc1將預處理後的程序編譯成彙編代碼;最後由arm-elf-as將彙編代碼編譯成目標代碼。
1.命令格式
arm-elf-gcc [options] file…
在命令arm-elf-gcc後面跟一個或多個選項,選項間用空格隔開,然後跟一個或多個目標文件。
例如,將test.c 編譯成目標文件test.o 並且生成調試信息:
arm-elf-gcc –g –c –o test.o test.c
2.命令選項列表
輸出控制選項:
-c 將輸入的源文件編譯成目標文件
-S 將C/C++文件生成彙編文件
-o file 將輸出內容存於文件file
-pipe 在編譯的不同階段之間採用管道通訊方式
-v 打印出編譯過程中執行的命令
-x language 說明文件的輸入類型爲language
C語言選項:
-ansi 支持所有ANSI C程序
警告選項:
-w 關閉所有警告
-Wall 打開所有警告
-Wimplicit 如果有隱含申明,顯示警告信息
-Wno-implicit 不顯示對隱含申明的警告
調試選項:
-g 在文件中產生調試信息(調試信息的文件格式有stabs、COFF、XCOFF、DWARF)
優化選項:
-O0 不優化
-O1 一級優化
-O2 二級優化
-O3 三級優化
預處理選項:
-E 運行C的預處理器
-C 在運用-E進行預處理時不去掉註釋
-D macro 定義宏macro爲1
-D macro=defn 定義宏macro爲defn
彙編選項:
-Wa,option 將選項option傳遞 給彙編器
搜索路徑選項:
-I dir 設置搜索路徑爲dir
-I- 指定只對 #include "file",有效的頭文件搜索目錄
3. 源文件類型的識別
arm-elf-gcc能夠自動根據文件名後綴識別文件類型.
文件名後綴和文件類型的對應關係如下:
*.c ——C源文件
*.i ——經過預處理後的C源文件
*.h ——C頭文件
*.ii ——經過預處理後的C++源文件
*.cc ——C++源文件
*.cxx ——C++源文件
*.cpp ——C++源文件
*.C ——C++源文件
*.s ——不需要預處理的彙編文件
*.S ——需要預處理的彙編文件
此外,用戶可通過-x language說明文件的輸入類型,此時可以不用以上的後綴規則。
-x language
其中的language可爲:
c ——C源文件
c++ ——C++源文件
c-header ——C頭文件
cpp-output ——經過預處理後的C源文件
c++-cpp-output ——經過預處理後的C++源文件
assembler ——不需要預處理的彙編文件
assembler-with-cpp ——需要預處理的彙編文件
例如,編譯一個不需要預處理的C程序:
arm-elf-gcc –c –g –x cpp-output test.c
1. 下載源文件、補丁和建立編譯的目錄
2. 建立內核頭文件
3. 建立二進制工具(binutils)
4. 建立初始編譯器(bootstrap gcc)
5. 建立c庫(glibc)
6. 建立全套編譯器(full gcc)
ELDK;支持GDB的BDIGDB Firmware FOR Linux;基於windows的嵌入式Linux交叉開發工具軟件INSIGHT GNUPROXTOOLS ;支持GDB的BDIGDB FIRMWARE FOR WINDOWS
bootloader
German DENK U-boot GNU
fuction:
network support;(tftp/Bootp);;;FlashRAM ;串口deng多種方式下載內核
surport serial port download software by Kermit binary ; S-Records