1.arm-none-linux-gnueabi-gcc下載下傳
http://www.veryarm.com/arm-none-linux-gnueabi-gcc
arm-none-Linux-gnueabi-gcc是 Codesourcery 公司(目前已經被Mentor收購)基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM系統中所有環節的代碼,包括裸機程式、u-boot、Linux kernel、filesystem和App應用程式。使用時,按照主機平台,可以下載下傳以下任一版本中的一個,結果是一樣的:
- Linux解壓版:在Linux主機(如Ubuntu、RedHat等)直接解壓即可使用。推薦方式!
- Linux安裝版:在Linux主機下執行後按照提示安裝後使用。
- Windows解壓版:在Windows系統下解壓後使用,但是需要MingW32。
- Windows安裝版:在Windows系統下安裝後使用。
- RPM安裝版:RedHat系統安裝包,新版本不提供該類安裝包。
- 源碼版:交叉編譯器源代碼,一般很少用到。
為友善國内使用者下載下傳使用,我們從Codesourcery(Mentor)官網下載下傳了所有版本的arm-none-linux-gnueabi-gcc編譯器,并放到國内雲盤上提供下載下傳。因為版本很多,可能難以選擇,但是我們建議您使用最新版本,即有最新~标志的下載下傳項。
1 Linux解壓版
gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2006q1-3-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2006q1-6-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2006q3-26-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2007q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2007q1-21-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2008q3-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.bz2 —— 下載下傳
arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2013.11-33-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下載下傳
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 最新~推薦!—— 下載下傳
2 Linux安裝版
arm-2006q3-26-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2007q1-10-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2007q1-21-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2007q3-51-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2008q1-126-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2008q3-41-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2008q3-72-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2009q1-176-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2009q1-203-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2009q3-67-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2010.09-50-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2010q1-202-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2011.03-41-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2011.09-70-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2012.03-57-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2012.09-64-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2013.05-24-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2013.11-33-arm-none-linux-gnueabi.bin —— 下載下傳
arm-2014.05-29-arm-none-linux-gnueabi.bin —— 最新~ 下載下傳
3 Windows Mingw32 版
gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2006q3-26-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2007q1-10-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2007q1-21-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2007q3-51-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2008q1-126-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2008q3-41-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2008q3-72-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2009q1-176-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2009q1-203-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2009q3-67-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2010.09-50-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2010q1-202-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2011.03-41-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2011.09-70-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2012.03-57-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2012.09-64-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2013.05-24-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2013.11-33-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下載下傳
arm-2014.05-29-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 最新~ 下載下傳
4 Windows安裝版
gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2006q1-3-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2006q1-6-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2006q3-26-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2007q1-10-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2007q1-21-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2007q3-51-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2008q1-126-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2008q3-41-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2008q3-72-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2009q1-176-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2009q1-203-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2009q3-67-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2010.09-50-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2010q1-202-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2011.03-41-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2011.09-70-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2012.03-57-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2012.09-64-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2013.05-24-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2013.11-33-arm-none-linux-gnueabi.exe —— 下載下傳
arm-2014.05-29-arm-none-linux-gnueabi.exe —— 最新~ 下載下傳
5 PRM安裝版
arm-arm-none-linux-gnueabi-2007q3-51.i686.rpm —— 下載下傳
6 源碼
gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2006q1-3-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2006q1-6-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2006q3-26-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2007q1-10-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2007q1-21-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2007q3-51-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2008q1-126-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2008q3-41-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2008q3-72-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2009q1-176-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2009q1-203-arm-none-linux-gnueabi.src.tar.bz2.bz2 —— 下載下傳
arm-2009q3-67-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2010.09-50-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2011.03-41-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2011.09-70-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2012.03-57-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2012.09-64-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2013.05-24-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2013.11-33-arm-none-linux-gnueabi.src.tar.bz2 —— 下載下傳
arm-2014.05-29-arm-none-linux-gnueabi.src.tar.bz2 —— 最新~ 下載下傳
Mentor官方下載下傳位址(需要注冊,注冊之後官方會發送一個下載下傳位址到郵箱裡面):http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/evaluations/。
文章來自VeryARM:http://www.veryarm.com/arm-none-linux-gnueabi-gcc,轉載請保留。
2.arm-none-linux-gnueabi交叉工具鍊與arm-linux-gcc 有差別嗎?
http://bdbaishitong.blog.163.com/blog/static/201493080201332094320957/
eabi标準的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個連結
終于,郁悶已久的問題攻破了,用了三種配置交叉編譯的方法,最終在開發闆上實作成功了,現在想一想,有的時候真的也是運氣。
之前已經試驗過使用arm-linux-gcc-3.4.1配置交叉編譯編譯環境,配置成功了,在開發闆上失敗了~
後來使用腳本建立交叉編譯環境(crosstool-0.43),配置成功了(這個用了相當長的時間),在開發闆上失敗了~
終于,在一個偶然的機會(其實是浏覽無數網頁後),我終于找到了一個好的方法,并成功在開發闆上運作。先說一下網上的一些方法,有些所謂的預設安裝了一些程式,但是在實際運作時發現根本沒有安裝,而且很多地方不知道該如何安裝。再有就是文章一上來就說安裝什麼什麼軟體,但是在網上搜根本找不到。隻能說很多人隻轉載文章,根本沒有試驗過。但是我還是幸運的找到了一個靠譜的文章http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE
根據上面的做法,我成功了,在此小做總結。
首先下載下傳工具鍊,幸好這篇文章給出了這個網站,要不還不知道要找多久。
http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
70多M很快就下完了,若不是root使用者下,可以将檔案解壓到home的某個目錄下。
tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/..../arm
那麼,在這個目錄下會生成一個arm-2008q3檔案夾。
更改路徑不用說了,或者臨時或者非臨時。我就直接改~/.bashrc了,在最後加:
export PATH=/usr/local/arm-2008q3/bin:${PATH}
ok~現在使你路徑生效吧:
source ~/.bashrc
再輸入:export CROSS_COMPILE=arm-none-linux-gnueabi-
作用是:當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。
也可以輸入:export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-
這種種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精确的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具的絕對路徑。
現在一切就緒,随便編譯個hello world.c檔案,用arm-none-linux-gnueabi-gcc helloworld.c -o helloworld,生成的helloworld檔案通過nfs挂載到闆子上。
最最後,在minicom下輸入:./helloworld。
就會顯示你希望見到的輸出了。。。。。。
首先,從下面的位址下載下傳工具鍊
http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
等待下載下傳完成後,将工具鍊解壓到/usr/local/目錄,如果你沒有編譯主機上的root權限的話,你可以将工具鍊解壓到Linux使用者的home目錄中的某個位置(比如${HOME}/bin)
tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local
這個操作将會在/usr/local目錄中建立一個麼名為arm-2008q3的目錄。
接下來,你需要将這個新進添加的工具鍊的位置添加到PATH變量之中。編譯你的~/.bashrc檔案,在其中加入新的PATH變量
export PATH=/usr/local/arm-2008q3/bin:${PATH}
使用source指令在目前shell中啟用這個變化,這樣你就不需要重新登入系統使用新變量了。
source ~/.bashrc
或者直接在shell中使用export對目前shell做同樣的操作。
export PATH=/usr/local/arm-2008q3/bin:${PATH}
如果你并不是bash使用者,你可以修改你使用的shell所對應的環境設定檔案,比如,對于zsh來說,您應該修改~/.zsh檔案。或者,你需要在每次登入shell後首先運作上面的export操作。
因為在開發主機上進行交叉編譯意味着使用開發主機的能力生成另外一個體系結構上運作的二進制代碼,是以,一般來說,你需要編譯的軟體通常都會接受一個叫做CROSS_COMPILE的變量來指定産生哪個體系結構的代碼。是以,配置工具鍊的最後一個步驟就是設定這個變量。如果你現在使用ls指令檢視以下
ls /usr/local/arm-2008q3/bin/
目錄的話,你會看到很多以arm-none-linux-gnueabi-開始的可執行檔案,而這個共同的字首就是你需要的CROSS_COMPILE變量。現在,使用export指令設定環境變量
export CROSS_COMPILE=arm-none-linux-gnueabi-
現在,當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。當然,前提是,這些交叉編譯工具在你的PATH變量上。還有一種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精确的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具的絕對路徑。
export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-
在大多數情況下,你并不需要将上面的export指令加入~/.bashrc這樣的檔案,因為,你并不總是需要它們來做交叉編譯。比如,你僅僅希望編譯運作在開發主機上的程式時。
這樣,工具鍊就準備好了。
3.arm交叉編譯器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi差別
http://www.veryarm.com/296.html
命名規則
交叉編譯工具鍊的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]
- arch – 體系架構,如ARM,MIPS
- vendor – 工具鍊提供商
- os – 目标作業系統
- eabi – 嵌入式應用二進制接口(Embedded Application Binary Interface)
根據對作業系統的支援與否,ARM GCC可分為支援和不支援作業系統,如
- arm-none-eabi:這個是沒有作業系統的,自然不可能支援那些跟作業系統關系密切的函數,比如fork(2)。他使用的是newlib這個專用于嵌入式系統的C庫。
- arm-none-linux-eabi:用于Linux的,使用Glibc
執行個體
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于編譯 ARM 架構的裸機系統(包括 ARM Linux 的 boot、kernel,不适用編譯 Linux 應用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 核心的晶片使用,是以不支援那些跟作業系統關系密切的函數,比如fork(2),他使用的是 newlib 這個專用于嵌入式系統的C庫。
2、arm-none-linux-gnueabi-gcc
(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用于基于ARM架構的Linux系統,可用于編譯 ARM 架構的 u-boot、Linux核心、linux應用等。arm-none-linux-gnueabi基于GCC,使用Glibc庫,經過 Codesourcery 公司優化過推出的編譯器。arm-none-linux-gnueabi-xxx 交叉編譯工具的浮點運算非常優秀。一般ARM9、ARM11、Cortex-A 核心,帶有 Linux 作業系統的會用到。
3、arm-eabi-gcc
Android ARM 編譯器。
4、armcc
ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程式(u-boot、kernel),但是不能編譯 Linux 應用程式。armcc一般和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,是以 armcc 編譯器都是收費的(愛國版除外,呵呵~~)。
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc。
arm-none-symbianelf 用于symbian,沒用過,不知道C庫是什麼 。
Codesourcery
Codesourcery推出的産品叫Sourcery G++ Lite Edition,其中基于command-line的編譯器是免費的,在官網上可以下載下傳,而其中包含的IDE和debug 工具是收費的,當然也有30天試用版本的。
目前CodeSourcery已經由明導國際(Mentor Graphics)收購,是以原本的網站風格已經全部變為 Mentor 樣式,但是 Sourcery G++ Lite Edition 同樣可以注冊後免費下載下傳。
Codesourcery一直是在做ARM目标 GCC 的開發和優化,它的ARM GCC在目前在市場上非常優秀,很多 patch 可能還沒被gcc接受,是以還是應該直接用它的(而且他提供Windows下[mingw交叉編譯的]和Linux下的二進制版本,比較友善;如果不是很有時間和興趣,不建議下載下傳 src 源碼包自己編譯,很麻煩,Codesourcery給的shell腳本很多時候根本沒辦法直接用,得自行提取關鍵的部分手工執行,又費精力又費時間,如果想知道細節,其實不用自己編譯一遍,看看他是用什麼步驟建構的即可,如果你對交叉編譯器感興趣的話。
ABI 和 EABI
ABI:二進制應用程式接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程式(或者其他類型)和作業系統之間或其他應用程式的低級接口。
EABI:嵌入式ABI。嵌入式應用二進制接口指定了檔案格式、資料類型、寄存器使用、堆積組織優化和在一個嵌入式軟體中的參數的标準約定。開發者使用自己的彙編語言也可以使用 EABI 作為與相容的編譯器生成的彙編語言的接口。
兩者主要差別是,ABI是計算機上的,EABI是嵌入式平台上(如ARM,MIPS等)。
arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc
兩個交叉編譯器分别适用于 armel 和 armhf 兩個不同的架構,armel 和 armhf 這兩種架構在對待浮點運算采取了不同的政策(有 fpu 的 arm 才能支援這兩種浮點運算政策)。
其實這兩個交叉編譯器隻不過是 gcc 的選項 -mfloat-abi 的預設值不同。gcc 的選項 -mfloat-abi 有三種值 soft、softfp、hard(其中後兩者都要求 arm 裡有 fpu 浮點運算單元,soft 與後兩者是相容的,但 softfp 和 hard 兩種模式互不相容):
soft: 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。
softfp: armel架構(對應的編譯器為 arm-linux-gnueabi-gcc )采用的預設值,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,隻需要儲存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
hard: armhf架構(對應的編譯器 arm-linux-gnueabihf-gcc )采用的預設值,用fpu計算,傳參數也用fpu中的浮點寄存器傳,省去了轉換,性能最好,但是中斷負荷高。
把以下測試使用的C檔案内容儲存成 mfloat.c:
#include <stdio.h>
int main(void)
{
double a,b,c;
a = 23.543;
b = 323.234;
c = b/a;
printf(“the 13/2 = %f\n”, c);
printf(“hello world !\n”);
return 0;
}
1、使用 arm-linux-gnueabihf-gcc 編譯,使用“-v”選項以擷取更詳細的資訊:
# arm-linux-gnueabihf-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
-mfloat-abi=hard
可看出使用hard硬體浮點模式。
2、使用 arm-linux-gnueabi-gcc 編譯:
# arm-linux-gnueabi-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
-mfloat-abi=softfp
可看出使用softfp模式。
交叉編譯工具
參考資料
- 交叉編譯器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的差別:http://www.cnblogs.com/xiaotlili/p/3306100.html
- arm-none-linux-gnueabi,arm-none-eabi 與arm-eabi 差別:http://blog.csdn.net/mantis_1984/article/details/21049273
- What’s the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490
文章來自VeryARM:http://www.veryarm.com/296.html,轉載請保留。
4. arm-none-linux-gnueabi,arm-none-eabi 與arm-eabi 差別
http://blog.csdn.net/mantis_1984/article/details/21049273
arm-none-linux-gnueabi
連結工具命名:
arch-vendor-(os-)abi
1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)
用于編譯ARM架構的u-boot、linux核心、linux應用等
2、arm-none-eabi
用于編譯ARM架構的裸機系統(包括linux的 boot、kernel)
3、arm-eabi
Android ARM 編譯器
arm-none-linux-gnueabi交叉編譯器是codesourcery公司推出的,基于GCC,但是進行過優化的編譯器。官方網站
http://www.codesourcery.com/
codesourcery推出的産品叫Sourcery G++ Lite Edition,其中基于command-line的編譯器是免費的,在官網上可以下載下傳,而其中包含的IDE和debug 工具是收費的,當然也有30天試用版本的。
arm-none-linux-gnueabi-xxx用它的最大理由我想應該是浮點運算。
結果測試發現: int backtrace(void **buffer,int size) 在實際使用過程中,隻能列印出空的調用堆棧
而arm-linux-gcc可以!
5.交叉編譯器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的差別
http://www.cnblogs.com/xiaotlili/p/3306100.html
交叉編譯器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的差別
自己之前一直沒搞清楚這兩個交叉編譯器到底有什麼問題,特意google一番,總結如下,希望能幫到道上和我有同樣困惑的兄弟…..
一. 什麼是ABI和EABI
1) ABI: 二進制應用程式接口(Application Binary Interface (ABI) for the ARM Architecture)
在計算機中,應用二進制接口描述了應用程式(或者其他類型)和作業系統之間或其他應用程式的低級接口.
ABI涵蓋了各種細節,如:
資料類型的大小、布局和對齊;
調用約定(控制着函數的參數如何傳送以及如何接受傳回值),例如,是所有的參數都通過棧傳遞,還是部分參數通過寄存器傳遞;哪個寄存器用于哪個函數參數;通過棧傳遞的第一個函數參數是最先push到棧上還是最後;
系統調用的編碼和一個應用如何向作業系統進行系統調用;
以及在一個完整的作業系統ABI中,目标檔案的二進制格式、程式庫等等。
一個完整的ABI,像Intel二進制相容标準 (iBCS) ,允許支援它的作業系統上的程式不經修改在其他支援此ABI的操作體統上運作。
ABI不同于應用程式接口(API),API定義了源代碼和庫之間的接口,是以同樣的代碼可以在支援這個API的任何系統中編譯,ABI允許編譯好的目标代碼在使用相容ABI的系統中無需改動就能運作。
2) EABI: 嵌入式ABI
嵌入式應用二進制接口指定了檔案格式、資料類型、寄存器使用、堆積組織優化和在一個嵌入式軟體中的參數的标準約定。
開發者使用自己的彙編語言也可以使用EABI作為與相容的編譯器生成的彙編語言的接口。
支援EABI的編譯器建立的目标檔案可以和使用類似編譯器産生的代碼相容,這樣允許開發者連結一個由不同編譯器産生的庫。
EABI與關于通用計算機的ABI的主要差別是應用程式代碼中允許使用特權指令,不需要動态連結(有時是禁止的),和更緊湊的堆棧幀組織用來節省記憶體。廣泛使用EABI的有Power PC和ARM.
二. gnueabi相關的兩個交叉編譯器: gnueabi和gnueabihf
在debian源裡這兩個交叉編譯器的定義如下:
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可見這兩個交叉編譯器适用于armel和armhf兩個不同的架構, armel和armhf這兩種架構在對待浮點運算采取了不同的政策(有fpu的arm才能支援這兩種浮點運算政策)
其實這兩個交叉編譯器隻不過是gcc的選項-mfloat-abi的預設值不同. gcc的選項-mfloat-abi有三種值soft,softfp,hard(其中後兩者都要求arm裡有fpu浮點運算單元,soft與後兩者是相容的,但softfp和hard兩種模式互不相容):
soft : 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。
softfp : armel架構(對應的編譯器為gcc-arm-linux-gnueabi)采用的預設值,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,隻需要儲存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
hard : armhf架構(對應的編譯器gcc-arm-linux-gnueabihf)采用的預設值,用fpu計算,傳參數也用fpu中的浮點寄存器傳,省去了轉換, 性能最好,但是中斷負荷高。
把以下測試使用的c檔案内容儲存成mfloat.c:
#include <stdio.h>
int main(void)
{
double a,b,c;
a = 23.543;
b = 323.234;
c = b/a;
printf(“the 13/2 = %f\n”, c);
printf(“hello world !\n”);
return 0;
}
1)使用arm-linux-gnueabihf-gcc編譯,使用“-v”選項以擷取更詳細的資訊:
# arm-linux-gnueabihf-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
-mfloat-abi=hard,可看出使用hard硬體浮點模式。
2)使用arm-linux-gnueabi-gcc編譯:
# arm-linux-gnueabi-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
-mfloat-abi=softfp,可看出使用softfp模式。
三. 拓展閱讀
下文闡述了ARM代碼編譯時的軟浮點(soft-float)和硬浮點(hard-float)的編譯以及連結實作時的不同。從VFP浮點單元的引入到軟浮點(soft-float)和硬浮點(hard-float)的概念
VFP (vector floating-point)
從ARMv5開始,就有可選的 Vector Floating Point (VFP) 子產品,當然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不帶VFP的模式供晶片廠商選擇。
VFP經過若幹年的發展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(隻使用16個浮點寄存器,預設為32個)和VFPv3+NEON (如大多數的Cortex-A8晶片) 。對于包含NEON的ARM晶片,NEON一般和VFP公用寄存器。
硬浮點Hard-float
編譯器将代碼直接編譯成發射給硬體浮點協處理器(浮點運算單元FPU)去執行。FPU通常有一套額外的寄存器來完成浮點參數傳遞和運算。
使用實際的硬體浮點運算單元FPU當然會帶來性能的提升。因為往往一個浮點的函數調用需要幾個或者幾十個時鐘周期。
軟浮點 Soft-float
編譯器把浮點運算轉換成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。
現在的Linux系統預設編譯選擇使用hard-float,即使系統沒有任何浮點處理器單元,這就會産生非法指令和異常。因而一般的系統鏡像都采用軟浮點以相容沒有VFP的處理器。
armel ABI和armhf ABI
在armel中,關于浮點數計算的約定有三種。以gcc為例,對應的-mfloat-abi參數值有三個:soft,softfp,hard。
soft是指所有浮點運算全部在軟體層實作,效率當然不高,會存在不必要的浮點到整數、整數到浮點的轉換,隻适合于早期沒有浮點計算單元的ARM處理器;
softfp是目前armel的預設設定,它将浮點計算交給FPU處理,但函數參數的傳遞使用通用的整型寄存器而不是FPU寄存器;
hard則使用FPU浮點寄存器将函數參數傳遞給FPU處理。
需要注意的是,在相容性上,soft與後兩者是相容的,但softfp和hard兩種模式不相容。
預設情況下,armel使用softfp,是以将hard模式的armel單獨作為一個abi,稱之為armhf。
而使用hard模式,在每次浮點相關函數調用時,平均能節省20個CPU周期。對ARM這樣每個周期都很重要的體系結構來說,這樣的提升無疑是巨大的。
在完全不改變源碼和配置的情況下,在一些應用程式上,使用armhf能得到20%——25%的性能提升。對一些嚴重依賴于浮點運算的程式,更是可以達到300%的性能提升。
Soft-float和hard-float的編譯選項
在CodeSourcery gcc的編譯參數上,使用-mfloat-abi=name來指定浮點運算處理方式。-mfpu=name來指定浮點協處理的類型。
可選類型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。
使用-mfloat-abi=hard (等價于-mhard-float) -mfpu=vfp來選擇編譯成硬浮點。使用-mfloat-abi=softfp就能相容帶VFP的硬體以及soft-float的軟體實作,運作時的連接配接器ld.so會在執行浮點運算時對于運算單元的選擇,
是直接的硬體調用還是庫函數調用,是執行/lib還是/lib/vfp下的libm。-mfloat-abi=soft (等價于-msoft-float)直接調用軟浮點實作庫。
在ARM RVCT工具鍊下,定義fpu模式:
–fpu softvfp
–fpu softvfp+vfpv2
–fpu softvfp+vfpv3
–fpu softvfp+vfpv_fp16
–fpu softvfp+vfpv_d16
–fpu softvfp+vfpv_d16_fp16.
定義浮點運算類型
–fpmode ieee_full : 所有單精度float和雙精度double的精度都要和IEEE标準一緻,具體的模式可以在運作時動态指定;
–fpmode ieee_fixed : 舍入到最接近的實作的IEEE标準,不帶不精确的異常;
–fpmode ieee_no_fenv :舍入到最接近的實作的IEEE标準,不帶異常;
–fpmode std :非規格數flush到0、舍入到最接近的實作的IEEE标準,不帶異常;
–fpmode fast : 更積極的優化,可能會有一點精度損失。
Remember don‘t at a loss and let the brain to calm down when comes questions, so can solve them faster!
6. 安裝C/C++交叉編譯環境 http://blog.csdn.net/nokiaguy/article/details/8509739
X86架構的CPU采用的是複雜指令集(Complex Instruction Set Computer,CICS),而ARM架構的CPU使用的是精簡指令集(Reduced Instruction Set Computer,RISC)。由于這兩種架構的CPU使用了不同的指令集,是以在X86架構上開發可運作在ARM架構上的程式就必須要使用交叉編譯器。通常交叉編譯器和相關工具包含的了很多可執行檔案以及大量的共享庫及頭檔案等資源。這些資源的集合稱為交叉編譯環境。
在Internet上可以找到內建好的交叉編譯環境,Android NDK和Android源代碼中也包含的交叉編譯環境。當然,如果我們需要一個完全獨立的交叉編譯環境,可以下載下傳內建好的交叉編譯環境,也可以自己制作(比較複雜,建議讀者下載下傳內建好的交叉編譯環境)。下面介紹一個CodeSourcery交叉編譯環境,這個交叉編譯環境直接下載下傳安裝就可以安裝。
讀者可通過如下的網站通路CodeSourcery下載下傳頁面。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
上面的頁面并未直接提供CodeSourcery的下載下傳連結,讀者可以點選“Download the GNU/Linux Release”連結,并輸入Email(建議使用Gmail)、位址等資訊,最後點選“Get Lite!”按鈕送出資訊。如圖2-29所示。最後系統會将下載下傳位址發送到剛才輸入的Email。
進入下載下傳頁面,會看到如圖2-30所示的不同版本的下載下傳連結,選擇最新的版本即可。
圖2-30 CodeSourcery的不同版本
進入CodeSourcery的下載下傳頁面後,會看到如圖2-31所示的下載下傳連結。目前CodeSourcery有Windows和Linux兩個版本。本書使用的是第1個(IA32 GNU/Linux Installer)。
Linux版本的安裝檔案是bin格式,讀者可執行下面的指令安裝CodeSourcery。其中package表示CodeSourcery的安裝檔案名。
sh package.bin
執行上面的指令後,會顯示可視化的安裝界面,如圖2-32所示,讀者可按提示安裝CodeSourcery。
為了使用友善,建議讀者将如下路徑加到PATH環境變量中。
/root/compilers/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin
下面編寫一個簡單的C程式來測試一下這個交叉編譯環境。
[cpp] view plain copy
- // first.c
- #include <stdio.h>
- int main()
- {
- printf("first arm program\n");
- return 0;
- }
輸入下面的指令編譯first.c檔案(需要加-static選項)。
# arm-none-linux-gnueabi-gcc -static -o first first.c
輸入下面的指令将first檔案上傳到任意的Android裝置的/data/local目錄中(沒有root權限也可以)。
# adb push first /data/local
使用adb shell指令進入Android裝置的控制台,并進入/data/local目錄,執行如下的指令
# ./first
執行上面的指令就會輸出“first arm program”資訊。first程式在X86架構上運作的Ubuntu Linux中是無法運作的。讀者可以試着在Ubuntu Linux中運作first程式,看看會發生什麼。
注意:在安裝Code Sourcery的過程中會在/lib目錄尋找一個libc.so.6庫檔案,但在Ubuntu Linux11.04及以上版本/lib目錄已經沒有libc.so.6庫檔案了。這個庫檔案被放在了其他的目錄。在32位的Ubuntu Linux中該檔案的路徑是/lib/i386-linux-gnu/libc.so.6,在64位的Ubuntu Linux中該檔案的路徑是/lib/x86_64-linux-gnu/libc.so.6。在安裝Code Sourcery之前可以使用ln指令為libc.so.6檔案在/lib目錄建立一個連結。
下一篇:開發可統計單詞個數的Android驅動程式(1)
本文節選至《Android深度探索(卷1):HAL與驅動開發》,接下來幾篇文章将詳細闡述如何開發ARM架構的Linux驅動,并分别利用android程式、NDK、可執行檔案測試Linux驅動。可在ubuntu Linux、Android模拟器和S3C6410開發闆(可以選購OK6410-A開發闆,需要刷Android)
7. arm-none-linux-gnueabi交叉工具鍊安裝 http://www.eefocus.com/PSOCPSOC/blog/11-08/228845_b0bc2.html
arm-none-linux-gnueabi交叉工具鍊與arm-linux-gcc 的差別:
參考網友的說法:eabi标準的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個連結
參考網友的一些做法:
1 下載下傳arm-2009q1-203-arm-none-linux-gnueabi.bin
2 執行./arm-2009q1-203-arm-none-linux-gnueabi.bin 在安裝的時候選擇推薦的路徑/opt/arm2009q1
3 修改環境變量 gedit~/.bashrc 在檔案最後面添加export PATH="/opt/arm-2009q1/bin:$PATH"
4 修改以後執行 source /.bashrc 使得剛才的設定生效
5 測試安裝結果 輸入 arm-none-linux-gnueabi-gcc6 提示NO input file 成功……
我參考他的方法,在網上找arm-2009q1-203-arm-none-linux-gnueabi.bin,但是找了N久沒有找到,是以沒有參考他的方法,看了一些TI網站的資料,為友善自己查閱,也友善網友參考,少走彎路,特此寫下我的安裝過程和一些心得,如果網友發現錯誤,敬請指正。
1:下載下傳交叉編譯工具鍊
下載下傳連結為:http://www.codesourcery.com/sgpp/lite/arm/portal/release858
下載下傳linux/GNU的就可以了,下載下傳下來名字為:
arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
下面要使用這個檔案安裝
另外說明我是使用的root權限,#sudo -i 切換到root權限下。
預設是安裝在/opt目錄下的,一般的Ubuntu安裝完成之後都會在根目錄下有一個opt目錄,
如果沒有就建立一個新的目錄
# mkdir -p /opt
2:解壓源檔案
參考TI的安裝,安裝路徑為/opt目錄,解壓源檔案到/opt目錄下。
# tar -vxjf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt
3:設定環境變量
注意我使用的是root權限,如果不是使用的root權限就要改你對應的相應的檔案了
# gedit ~/.bashrc
在.bashrc檔案的末尾最後添加一行,來增加一個環境變量
export PATH="/opt/arm-2009q1/bin:$PATH"
4:使得剛才的設定生效
# source /.bashrc
5檢視linux的環境變量
#echo $PATH
# printenv
6 測試安裝結果 輸入
# arm-none-linux-gnueabi-gcc
提示NO input file ,
到此為止安裝完畢了,OK,大功告成。
8、 linux下arm-none-linux-gnueabi交叉編譯環境的建立
http://blog.const.net.cn/a/17516.htm
1.通路codesourcery官方網站下載下傳最新的ARM交叉編譯工具鍊,下載下傳版本arm-2009q3:[喝小酒的網摘]http://blog.const.net.cn/a/17516.htm
http://www.codesourcery.com/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 2.解壓
$ tar -jxvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 3.移動到/usr下面 mv arm-2009q3 /usr/ 4.設定環境變量 $ sudo su # vim /etc/bash.bashrc 在最後加上:
export PATH=$PATH:/usr/arm-2009q3/bin
export PATH 啟動 環境變量設定: #source /root/.bashrc 檢查是否設定成功: #echo $PATH 結果:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/arm-2009q3/bin
說明設定好了 :-) 5.檢查 安裝是否成功: $ arm-none-linux-gnueabi-gcc -v ==> Using built-in specs.
Target: arm-none-linux-gnueabi
...
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
說明安裝成功。[喝小酒的網摘]http://blog.const.net.cn/a/17516.htm