//因之前是在qemu上是直接编译的,现在采用交叉编译,故需要先查看各依赖库的版本号
apt list
交叉编译工具
//总结:考虑到目前长期稳定使用的aarch64-linux-gnu-gcc,和ubuntu版本为20.04,故采用
//正点原子采用的是:gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf
//各种交叉编译工具链的区别(交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi])
1)eabi- 嵌入式应用二进制接口(Embedded Application Binary Interface)
2)gnueabi和gnueabihf的区别(硬浮点、软浮点)
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可见这两个交叉编译器适用于arm-el和arm-hf两个不同的架构, 在对待浮点运算采取了不同的策略,
其实这两个交叉编译器只不过是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中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
3)
4)实例解释
ARM32、小端、裸机工程: arm-none-eabi
ARM32、小端、Linux工程: arm-none-linux-gnueabihf
ARM64、小端、裸机工程: aarch64-none-elf
ARM64、小端、Linux工程: aarch64-none-linux-gnu
ARM64、大端、Linux工程: aarch64_be-none-linux-gnu
//下载链接
1)https://releases.linaro.org/components/toolchain/binaries/ //目前linaro官网不推荐这个入口下载工具链了,使用这个链接 (gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz 二进制版本的最新版本)
2)https://snapshots.linaro.org/gnu-toolchain/ //这是每个月更新的快照
3)https://developer.arm.com/downloads/-/gnu-a //这是arm提供的稳定版本 (gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz 没改名字的最高版本)
//其它:
gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz | |
编译器- 工具厂商linaro- 版本6.5.0 - 日期 - 使用平台x86 _目标平台arm64 | |
gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz | |
编译器- 工具厂商linaro- 版本6.5.0 - 日期 - 使用平台x86 _目标平台arm32硬浮点 | |
gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz | |
编译器- arm- 版本10.2 - 日期 - 使用平台x86 _目标平台arm64 |