arm-linux-gcc 和 arm-elf-gcc 的區(qū)別 arm-linux-gcc 和 arm-elf-gcc 的區(qū)...
在基于ARM的嵌入式系統(tǒng)開發(fā)中,常常用到交叉編譯的GCC工具鏈有兩種:
arm-linux-*和 arm-elf-*,兩者區(qū)別主要在于使用不同的C庫文件。arm-linux-*使用
GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統(tǒng)
的開發(fā)的C庫newlib.Glibc。uClibc/uC-libc以及 newlib都是C語言庫文件,只是所應(yīng)
用的領(lǐng)域不同而已,Glibc是針對PC開發(fā)的,uClibc/uC-libc是與Glibc API兼容的小型
化C語言庫,實現(xiàn)了Glibc部分功能。
關(guān)于uClibc/uC-libc的說明,詳見如下:
There are two libc libraries commonly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.
uC-libc is the original library for uClinux. It was based on sources
from the Linux-8086 C library which was part of the ELKs project with m68000
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.
The uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m68000 and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements
uClinux有兩個經(jīng)常使用的libc庫:uC-libc和uClibc。雖然兩者名字很相似,其實有差
別,下面就簡單的介紹一下二者的不同之處。uC -libc是最早為uClinux開發(fā)的庫,是
Jeff Dionne和Kenneth Albanowski為在EKLs項目中支持m68000在Linux-8086 C庫源碼
上移植的。uC-libc是一個完全的libc實現(xiàn),但其中有一些api是非標(biāo)準(zhǔn)的,有些libc的
標(biāo)準(zhǔn)也沒有實現(xiàn)。uC-libc穩(wěn)定地支持 m68000,ColdFire和沒有MMU的ARM。其主要設(shè)計
目標(biāo)是“小”、"輕",并盡量與標(biāo)準(zhǔn)一致,雖然它的API和很多l(xiāng)ibc兼容,但是似乎并
不像它期望的那樣和所有標(biāo)準(zhǔn)一致。
uClibc就是為了解決這個問題從uC-libc中發(fā)展出來的。它的所有API都是標(biāo)準(zhǔn)的(正確
的返回類型,參數(shù)等等),它彌補了uC-libc中沒有實現(xiàn)的libc標(biāo)準(zhǔn),現(xiàn)在已經(jīng)被移植到
多種架構(gòu)中。一般來講,它盡量兼容glibc以便使應(yīng)用程序用uClibc改寫變的容易。
uClibc能夠在標(biāo)準(zhǔn)的 VM linux和uClinux上面使用。為了應(yīng)用程序的簡潔,它甚至可以
在許多支持MMU的平臺上被編譯成共享庫。Erik Anderson在uClibc背后做了很多的工
作。uClibc支持許多系列的處理器:m68000,Coldfire,ARM,MIPS,v850, x86,
i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不斷增加的平臺支持顯示uClibc
能夠很容易的適應(yīng)新的架構(gòu)。uClinux發(fā)行版提供了環(huán)境能夠讓你選擇使用uC-libc或是
uClibc編譯。對于m68000和Coldfire平臺來說,選擇uC-libc還是稍微好一點,因為它
支持共享庫,而共享庫是這些cpu經(jīng)常使用的 libc.uClibc也幾乎和所有的平臺都能很
好的工作。選擇哪種libc取決于你的需求。
newlib 是一個用于嵌入式系統(tǒng)的開放源代碼的C語言程序庫,由libc和libm兩個庫組
成,特點是輕量級,速度快,可移植到很多CPU結(jié)構(gòu)上。newlib實現(xiàn)了許多復(fù)雜的功
能,包括字符串支持,浮點運算,內(nèi)存分配(如malloc)和I/O流函數(shù)(printf,fprinf()
等等)。其中l(wèi)ibc提供了c 語言庫的實現(xiàn),而libm提供了浮點運算支持。
在為ARM交叉編譯gcc編譯器時,對gcc指定不同的配置選項時,使用的C語言庫就不同,
gcc編譯器默認使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),當(dāng)使用
--with-newlib時,gcc編譯器不使用Glibc。當(dāng)沒有交叉編譯Glibc時,可以使用
--with-newlib禁止連接Glibc而編譯bootstrap gcc編譯器。從gcc源目錄下的
config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影響gcc連接C語言
庫,t-linux(--target=arm-linux)默認使用Glibc,-arm-elf(--target=arm-elf)使用
- Dinhibit_libc禁止連接Glibc,這時我們就可以使用newlib等其他C語言庫編譯GCC工
具鏈。
雖然GCC工具鏈配置了不同的的C語言庫,但由于這些C語言庫都可以用來支持GCC,它們
對核心數(shù)據(jù)的處理上不存在較大出入。因而arm-linux-* 和 arm-elf-*區(qū)別主要表現(xiàn)在
C語言庫的實現(xiàn)上,例如不同系統(tǒng)調(diào)用,不同的函數(shù)集實現(xiàn),不同的ABI\啟動代碼以及
不同系統(tǒng)特性等微小的差別。
arm-linux-*和 arm-elf-*的使用沒有一個絕對的標(biāo)準(zhǔn),排除不同庫實現(xiàn)的差異,gcc可
以編譯任何系統(tǒng)。arm-linux-*和 arm-elf-*都可以用來編譯裸機程序和操作系統(tǒng),只
是在遵循下面的描述時系統(tǒng)程序顯得更加協(xié)調(diào):
arm-linux-*針對運行l(wèi)inux的ARM機器,其依賴于指定的C語言庫Glibc,因為同樣使用
Glibc的linux而使得arm-linux-*在運行l(wèi)inux的ARM機器上編譯顯得更加和諧。
arm-elf-*則是一個獨立的編譯體系,不依賴于指定的C語言庫Glibc,可以使用newlib
等其他C語言庫,不要求操作系統(tǒng)支持,當(dāng)其使用為嵌入式系統(tǒng)而設(shè)計的一些輕巧的C語
言庫時編譯裸機程序(沒有l(wèi)inux等大型操作系統(tǒng)的程序),如監(jiān)控程序,bootloader等
能使得系統(tǒng)程序更加小巧快捷。
Linaro prebuilt toolchain does support both hard and soft floating
point. You can get it from https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08 try: ./arm-linux-gnueabihf-gcc -print-multi-lib
The default configure is --with-arch=armv7-a --with-tune=cortex-a9
--with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb
To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.
In your case, please try to change -march=armv5 to "-march=armv4t"
If you want to change to configure to cortex-a8 and armv5. You need
* Change cortex-a9 to cortex-a8 in
samples/linaro-arm-linux-gnueabihf/crosstool.config
* Change armv4t to armv5 in
contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,
Then follow the instructions to rebuild the toolchain
(contrib/linaro/doc/README.txt)
BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses
the prebuilt sysroot from Ubuntu Precise. If it does not work for you,
please use the latest crosstool-ng from http://crosstool-ng.org/.
實馬17342016872: 如何安裝arm - linux - gcc -
麟游縣過渡: ______ arm-linux-gcc是基于arm架構(gòu)的linux平臺交叉編譯工具.在安裝時主要有以下幾步: 1. 最常見的首先要下載arm-linux-gcc安裝包,或者也可以從網(wǎng)上下載arm-linux-gcc的源碼. 2. 進入Linux,將當(dāng)前目錄設(shè)為arm-linux-gcc的下載目錄,并且輸入tar ...
實馬17342016872: arm - none - linux - gnueabi - gcc 是什么工具鏈的一部份,與arm - linux - gcce有什么區(qū)別? -
麟游縣過渡: ______ arm-none-linux-gnueabi-gcc 只是告訴你支持eabi的功能,你當(dāng)然也可以把這個名字改成arm-linux-gcc執(zhí)行了,但是arm-linux-gcc的話是不可以直接改成arm-none-linux-gnueabi-gcc的,因為我們不知道arm-linux-gcc是什么形式的.現(xiàn)在的arm linux toolchain大部分都是arm-none-linux-gnueabi-gcc類型的,但是有的人家為了方便,就軟鏈接成arm-linux-gcc,我就是這么做的.呵呵.
實馬17342016872: arm - none - linux - gnueabi交叉工具鏈與arm - linux - gcc 有區(qū)別嗎 -
麟游縣過渡: ______ eabi標(biāo)準(zhǔn)的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個鏈接 終于,郁悶已久的問題攻破了,用了三種配置交叉編譯的方法,最終在開發(fā)板上實現(xiàn)成功了,現(xiàn)在想一想,有的時候真的也是運氣. 之前已經(jīng)試驗過使用arm-linux-...
實馬17342016872: 如何讓arm - linux - gcc有效 -
麟游縣過渡: ______ 命令行輸入 export PATH=$PATH:/usr/local/arm/bin/ 就OK了
實馬17342016872: arm - linux - gcc 報錯
麟游縣過渡: ______ 在編譯C語言源程序前,需要GCC會先調(diào)用預(yù)處理程序?qū)υ次募M行預(yù)處理,預(yù)處理程序名字叫cpp,對應(yīng)的arm交叉編譯器是arm-linux-cpp. 你這里可能的原因是你沒有把這些工具安裝在正確的位置,網(wǎng)上流傳的最廣的2.95.3的版本都是裝在/usr/local/arm/2.95.3下的;還有可能就是你的系統(tǒng)上根本就不存在arm-linux-cpp0這個文件.
實馬17342016872: linux上怎么切換不同版本的arm - linux - gcc?只需改一行函數(shù) -
麟游縣過渡: ______ ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux-gcc-3.4.1 ln -s /usr/local/arm/4.4.3/bin/arm-none-linux-eabi-gcc /usr/bin/arm-linux-gcc-4.4.3 建立好軟連接,后命令行中就可以使用arm-linux-gcc-3.4.1或者-4.4.3調(diào)用不同版本了.
實馬17342016872: arm - hisiv100nptl - linux - gcc和arm - hisiv300nptl - linux - gcc有什么區(qū)別 -
麟游縣過渡: ______ 都是arm-linux交叉編譯工具,版本不同而已(解壓目錄可能有點區(qū)別). 這2套編譯工具都比較新,使用上一般都能滿足要求,具體還要參考你要編譯的源代碼對編譯器的版本要求(README、Changelog等).
實馬17342016872: 如何查看arm - linux - gcc某個版本支持的 -
麟游縣過渡: ______ 1、首先以root用戶登入2、復(fù)制arm-linux-gcc-4.3.2.tgz到根目錄下tmp文件夾里3、解壓命令tar xvzf arm-linux-gcc-4.3.2 -C / 注意以上命令必須要有-C而且是大寫,后邊有個空格也要注意.4、配置下編譯環(huán)境路徑 在控制臺下輸入 gedit /root/....
實馬17342016872: 如何查看arm - linux - gcc某個版本支持的 -
麟游縣過渡: ______ 1、首先以root用戶登入 2、復(fù)制arm-linux-gcc-4.3.2.tgz到根目錄下tmp文件夾里 3、解壓命令tar xvzf arm-linux-gcc-4.3.2 -C / 注意以上命令必須要有-C而且是大寫,后邊有個空格也要注意. 4、配置下編譯環(huán)境路徑 在控制臺下輸入 gedit /root/....
arm-linux-*和 arm-elf-*,兩者區(qū)別主要在于使用不同的C庫文件。arm-linux-*使用
GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統(tǒng)
的開發(fā)的C庫newlib.Glibc。uClibc/uC-libc以及 newlib都是C語言庫文件,只是所應(yīng)
用的領(lǐng)域不同而已,Glibc是針對PC開發(fā)的,uClibc/uC-libc是與Glibc API兼容的小型
化C語言庫,實現(xiàn)了Glibc部分功能。
關(guān)于uClibc/uC-libc的說明,詳見如下:
There are two libc libraries commonly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.
uC-libc is the original library for uClinux. It was based on sources
from the Linux-8086 C library which was part of the ELKs project with m68000
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.
The uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m68000 and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements
uClinux有兩個經(jīng)常使用的libc庫:uC-libc和uClibc。雖然兩者名字很相似,其實有差
別,下面就簡單的介紹一下二者的不同之處。uC -libc是最早為uClinux開發(fā)的庫,是
Jeff Dionne和Kenneth Albanowski為在EKLs項目中支持m68000在Linux-8086 C庫源碼
上移植的。uC-libc是一個完全的libc實現(xiàn),但其中有一些api是非標(biāo)準(zhǔn)的,有些libc的
標(biāo)準(zhǔn)也沒有實現(xiàn)。uC-libc穩(wěn)定地支持 m68000,ColdFire和沒有MMU的ARM。其主要設(shè)計
目標(biāo)是“小”、"輕",并盡量與標(biāo)準(zhǔn)一致,雖然它的API和很多l(xiāng)ibc兼容,但是似乎并
不像它期望的那樣和所有標(biāo)準(zhǔn)一致。
uClibc就是為了解決這個問題從uC-libc中發(fā)展出來的。它的所有API都是標(biāo)準(zhǔn)的(正確
的返回類型,參數(shù)等等),它彌補了uC-libc中沒有實現(xiàn)的libc標(biāo)準(zhǔn),現(xiàn)在已經(jīng)被移植到
多種架構(gòu)中。一般來講,它盡量兼容glibc以便使應(yīng)用程序用uClibc改寫變的容易。
uClibc能夠在標(biāo)準(zhǔn)的 VM linux和uClinux上面使用。為了應(yīng)用程序的簡潔,它甚至可以
在許多支持MMU的平臺上被編譯成共享庫。Erik Anderson在uClibc背后做了很多的工
作。uClibc支持許多系列的處理器:m68000,Coldfire,ARM,MIPS,v850, x86,
i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不斷增加的平臺支持顯示uClibc
能夠很容易的適應(yīng)新的架構(gòu)。uClinux發(fā)行版提供了環(huán)境能夠讓你選擇使用uC-libc或是
uClibc編譯。對于m68000和Coldfire平臺來說,選擇uC-libc還是稍微好一點,因為它
支持共享庫,而共享庫是這些cpu經(jīng)常使用的 libc.uClibc也幾乎和所有的平臺都能很
好的工作。選擇哪種libc取決于你的需求。
newlib 是一個用于嵌入式系統(tǒng)的開放源代碼的C語言程序庫,由libc和libm兩個庫組
成,特點是輕量級,速度快,可移植到很多CPU結(jié)構(gòu)上。newlib實現(xiàn)了許多復(fù)雜的功
能,包括字符串支持,浮點運算,內(nèi)存分配(如malloc)和I/O流函數(shù)(printf,fprinf()
等等)。其中l(wèi)ibc提供了c 語言庫的實現(xiàn),而libm提供了浮點運算支持。
在為ARM交叉編譯gcc編譯器時,對gcc指定不同的配置選項時,使用的C語言庫就不同,
gcc編譯器默認使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),當(dāng)使用
--with-newlib時,gcc編譯器不使用Glibc。當(dāng)沒有交叉編譯Glibc時,可以使用
--with-newlib禁止連接Glibc而編譯bootstrap gcc編譯器。從gcc源目錄下的
config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影響gcc連接C語言
庫,t-linux(--target=arm-linux)默認使用Glibc,-arm-elf(--target=arm-elf)使用
- Dinhibit_libc禁止連接Glibc,這時我們就可以使用newlib等其他C語言庫編譯GCC工
具鏈。
雖然GCC工具鏈配置了不同的的C語言庫,但由于這些C語言庫都可以用來支持GCC,它們
對核心數(shù)據(jù)的處理上不存在較大出入。因而arm-linux-* 和 arm-elf-*區(qū)別主要表現(xiàn)在
C語言庫的實現(xiàn)上,例如不同系統(tǒng)調(diào)用,不同的函數(shù)集實現(xiàn),不同的ABI\啟動代碼以及
不同系統(tǒng)特性等微小的差別。
arm-linux-*和 arm-elf-*的使用沒有一個絕對的標(biāo)準(zhǔn),排除不同庫實現(xiàn)的差異,gcc可
以編譯任何系統(tǒng)。arm-linux-*和 arm-elf-*都可以用來編譯裸機程序和操作系統(tǒng),只
是在遵循下面的描述時系統(tǒng)程序顯得更加協(xié)調(diào):
arm-linux-*針對運行l(wèi)inux的ARM機器,其依賴于指定的C語言庫Glibc,因為同樣使用
Glibc的linux而使得arm-linux-*在運行l(wèi)inux的ARM機器上編譯顯得更加和諧。
arm-elf-*則是一個獨立的編譯體系,不依賴于指定的C語言庫Glibc,可以使用newlib
等其他C語言庫,不要求操作系統(tǒng)支持,當(dāng)其使用為嵌入式系統(tǒng)而設(shè)計的一些輕巧的C語
言庫時編譯裸機程序(沒有l(wèi)inux等大型操作系統(tǒng)的程序),如監(jiān)控程序,bootloader等
能使得系統(tǒng)程序更加小巧快捷。
Linaro prebuilt toolchain does support both hard and soft floating
point. You can get it from https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08 try: ./arm-linux-gnueabihf-gcc -print-multi-lib
The default configure is --with-arch=armv7-a --with-tune=cortex-a9
--with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb
To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.
In your case, please try to change -march=armv5 to "-march=armv4t"
If you want to change to configure to cortex-a8 and armv5. You need
* Change cortex-a9 to cortex-a8 in
samples/linaro-arm-linux-gnueabihf/crosstool.config
* Change armv4t to armv5 in
contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,
Then follow the instructions to rebuild the toolchain
(contrib/linaro/doc/README.txt)
BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses
the prebuilt sysroot from Ubuntu Precise. If it does not work for you,
please use the latest crosstool-ng from http://crosstool-ng.org/.
相關(guān)評說:
麟游縣過渡: ______ arm-linux-gcc是基于arm架構(gòu)的linux平臺交叉編譯工具.在安裝時主要有以下幾步: 1. 最常見的首先要下載arm-linux-gcc安裝包,或者也可以從網(wǎng)上下載arm-linux-gcc的源碼. 2. 進入Linux,將當(dāng)前目錄設(shè)為arm-linux-gcc的下載目錄,并且輸入tar ...
麟游縣過渡: ______ arm-none-linux-gnueabi-gcc 只是告訴你支持eabi的功能,你當(dāng)然也可以把這個名字改成arm-linux-gcc執(zhí)行了,但是arm-linux-gcc的話是不可以直接改成arm-none-linux-gnueabi-gcc的,因為我們不知道arm-linux-gcc是什么形式的.現(xiàn)在的arm linux toolchain大部分都是arm-none-linux-gnueabi-gcc類型的,但是有的人家為了方便,就軟鏈接成arm-linux-gcc,我就是這么做的.呵呵.
麟游縣過渡: ______ eabi標(biāo)準(zhǔn)的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個鏈接 終于,郁悶已久的問題攻破了,用了三種配置交叉編譯的方法,最終在開發(fā)板上實現(xiàn)成功了,現(xiàn)在想一想,有的時候真的也是運氣. 之前已經(jīng)試驗過使用arm-linux-...
麟游縣過渡: ______ 命令行輸入 export PATH=$PATH:/usr/local/arm/bin/ 就OK了
麟游縣過渡: ______ 在編譯C語言源程序前,需要GCC會先調(diào)用預(yù)處理程序?qū)υ次募M行預(yù)處理,預(yù)處理程序名字叫cpp,對應(yīng)的arm交叉編譯器是arm-linux-cpp. 你這里可能的原因是你沒有把這些工具安裝在正確的位置,網(wǎng)上流傳的最廣的2.95.3的版本都是裝在/usr/local/arm/2.95.3下的;還有可能就是你的系統(tǒng)上根本就不存在arm-linux-cpp0這個文件.
麟游縣過渡: ______ ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux-gcc-3.4.1 ln -s /usr/local/arm/4.4.3/bin/arm-none-linux-eabi-gcc /usr/bin/arm-linux-gcc-4.4.3 建立好軟連接,后命令行中就可以使用arm-linux-gcc-3.4.1或者-4.4.3調(diào)用不同版本了.
麟游縣過渡: ______ 都是arm-linux交叉編譯工具,版本不同而已(解壓目錄可能有點區(qū)別). 這2套編譯工具都比較新,使用上一般都能滿足要求,具體還要參考你要編譯的源代碼對編譯器的版本要求(README、Changelog等).
麟游縣過渡: ______ 1、首先以root用戶登入2、復(fù)制arm-linux-gcc-4.3.2.tgz到根目錄下tmp文件夾里3、解壓命令tar xvzf arm-linux-gcc-4.3.2 -C / 注意以上命令必須要有-C而且是大寫,后邊有個空格也要注意.4、配置下編譯環(huán)境路徑 在控制臺下輸入 gedit /root/....
麟游縣過渡: ______ 1、首先以root用戶登入 2、復(fù)制arm-linux-gcc-4.3.2.tgz到根目錄下tmp文件夾里 3、解壓命令tar xvzf arm-linux-gcc-4.3.2 -C / 注意以上命令必須要有-C而且是大寫,后邊有個空格也要注意. 4、配置下編譯環(huán)境路徑 在控制臺下輸入 gedit /root/....