交叉編譯器命名規(guī)則
交叉編譯器的命名規(guī)則:arch [-vendor] [-os] [-(gnu)eabi] [-language]
- arch - 體系架構(gòu), 如arm(ARM-32bit)、aarch64(ARM-64bit)、x86等;
- vendor -工具鏈提供商,經(jīng)常省略,或用 none 替代;
- os - 目標(biāo)操作系統(tǒng), 如linux,沒針對具體 os 則 用 none 替代。同時沒有 vendor 和os 使用一個 none 替代。
- eabi - 嵌入式應(yīng)用二進(jìn)制接口(Embedded Application binary Interface)
- language - 編譯語言,如gcc,g++
具體編譯器舉例
crosstool-ng交叉編譯工具樣本
制作交叉編譯工具鏈的 crosstool-ng 官網(wǎng)上就列出很多交叉編譯工具樣本,都是按以上命名規(guī)則命名的。
aarch64-ol7u9-linux-gnu
aarch64-ol8u6-linux-gnu
aarch64-ol8u7-linux-gnu
aarch64-rpi3-linux-gnu
aarch64-rpi4-linux-gnu
aarch64-unknown-linux-gnu
aarch64-unknown-linux-uclibc
arm-bare_newlib_cortex_m3_nommu-eabi
arm-cortex_a15-linux-gnueabihf
arm-cortexa5-linux-uclibcgnueabihf
arm-cortex_a8-linux-gnueabi
arm-cortexa9_neon-linux-gnueabihf
arm-multilib-linux-uclibcgnueabi
arm-nano-eabi
arm-none-eabi
arm-ol7u9-linux-gnueabi
arm-ol7u9-linux-gnueabihf
arm-picolibc-eabi
arm-unknown-eabi
arm-unknown-linux-gnueabi
arm-unknown-linux-musleabi
arm-unknown-linux-uclibcgnueabi
arm-unknown-linux-uclibcgnueabihf
x86_64-centos7-linux-gnu
x86_64-multilib-linux-gnu
x86_64-multilib-linux-musl
x86_64-multilib-linux-uclibc
x86_64-multilib-linux-uclibc,moxie-unknown-moxiebox
x86_64-multilib-linux-uclibc,powerpc-unknown-elf
x86_64-ol8u6-linux-gnu
x86_64-ol8u7-linux-gnu
x86_64-pc-linux-gnu,arm-picolibc-eabi
x86_64-ubuntu14.04-linux-gnu
x86_64-ubuntu16.04-linux-gnu
x86_64-unknown-linux-gnu
x86_64-unknown-linux-uclibc
x86_64-w64-mingw32
x86_64-w64-mingw32,arm-cortexa9_neon-linux-gnueabihf
x86_64-w64-mingw32,x86_64-pc-linux-gnu
arm交叉編譯器舉例
- arm-none-eabi-gcc
ARM architecture,no vendor,not target an operating system,complies with the ARM EABI(ARM 程序接口)
用于編譯 ARM 架構(gòu)的裸機(jī)系統(tǒng)(包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應(yīng)用 Application),一般用于ARM MCU系列芯片,如 ARM7、Cortex-M 和 Cortex-R ,沒有操作系統(tǒng),不支持那些跟操作系統(tǒng)關(guān)系密切的函數(shù),它使用的是newlib 這個專用于嵌入式系統(tǒng)的C庫,安裝方法:
sudo apt-get install gcc-arm-none-eabi
- arm-linux-gnueabi-gcc
ARM architecture, creates binaries that run on the Linux operating system, and uses the GNU EABI (GUN 程序接口)
也叫 arm-none-linux-gnueabi-gcc,因為一開始是沒有發(fā)行商的,目前由Linaro 公司發(fā)行,一般用于 ARM9、ARM11、Arm Cortex-A 系列芯片,帶有 Linux 操作系統(tǒng)。前者針對 32 位芯片,后者針對 64 位芯片,使用的是glibc庫。可用于交叉編譯ARM系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機(jī)程序、u-boot、Linux kernel、filesystem和App應(yīng)用程序,安裝方法:
sudo apt-get install gcc-arm-linux-gnueabi
- arm-linux-gnueabihf-gcc
和 arm-linux-gnueabi-gcc 區(qū)別不過是 gcc 的選項 -mfloat-abi 的默認(rèn)值不同,即浮點數(shù)處理上的不同,詳見后文解答。
? aarch64-none-linux-gnu-gcc
是arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc的ARM-64bit版本。
- arm-eabi-gcc
Android ARM 編譯器。
- arm-none-uclinuxeabi-gcc
用于uCLinux,使用glibc。
- arm-none-symbianelf-gcc
用于symbian。
幾個概念
ABI與EABI
ABI:二進(jìn)制應(yīng)用程序接口(Application Binary Interface)。在計算機(jī)中,應(yīng)用二進(jìn)制接口描述了應(yīng)用程序(或者其他類型)和操作系統(tǒng)之間或其他應(yīng)用程序的低級接口;
EABI:即嵌入式ABI,應(yīng)用于嵌入式系統(tǒng)的二進(jìn)制應(yīng)用程序接口(Embeded Application Binary Interface)。
兩者主要區(qū)別是,ABI是計算機(jī)上的,EABI是嵌入式平臺上(如ARM,MIPS等)。
gnueabi與gnueabihf
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
這兩個交叉編譯器適用于armel和armhf兩個不同的架構(gòu),armel和armhf這兩種架構(gòu)在對待浮點運算采取了不同的策略(有fpu的arm才能支持這兩種浮點運算策略)。
其實這兩個交叉編譯器只不過是gcc的選項-mfloat-abi的默認(rèn)值不同。gcc的選項-mfloat-abi有三種值soft、softfp、hard(其中后兩者都要求arm里有fpu浮點運算單元,soft與后兩者是兼容的,但softfp和hard兩種模式互不兼容):
soft:不用fpu進(jìn)行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟件模式。
softfp:armel架構(gòu)(對應(yīng)的編譯器為gcc-arm-linux-gnueabi)采用的默認(rèn)值,用fpu計算,但是傳參數(shù)用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負(fù)荷小,但是參數(shù)需要轉(zhuǎn)換成浮點的再計算。文章來源:http://www.zghlxwxcb.cn/news/detail-788799.html
hard:armhf架構(gòu)(對應(yīng)的編譯器gcc-arm-linux-gnueabihf)采用的默認(rèn)值,用fpu計算,傳參數(shù)也用fpu中的浮點寄存器傳,省去了轉(zhuǎn)換,性能最好,但是中斷負(fù)荷高。文章來源地址http://www.zghlxwxcb.cn/news/detail-788799.html
參考
- ARM 交叉編譯器命名規(guī)則
- ARM 交叉編譯工具鏈
到了這里,關(guān)于arm系列交叉編譯器各版本區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!