ARM交叉编译器gnueabi、gnueabihf 以及安装配置,helloworld测试

如果我们需要编译一个运行在X86架构上的helloworld程序,只需要在linux系统下执行
gcc helloworld.c -o helloworld

如果要在X86主机上编译一个在ARM系统上运行的程序,就需要用到交叉编译器。

1. 编译器命名规则:

交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]

arch - 体系架构,如ARM,MIPS
verdor - 工具链提供商,如飞思卡尔提供的工具简称fs
os - 目标操作系统,如linux
eabi - 嵌入式应用二进制接口,Embedded Application Binary Interface (EABI)
根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如

arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。他使用的是newlib这个专用于嵌入式系统的C库。

arm-none-linux-eabi:用于Linux的,使用Glibc

2. 示例:

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)

扫描二维码关注公众号,回复: 12046663 查看本文章

主要用于基于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。

3. 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中的浮点寄存器传,省去了转换,性能最
好,但是中断负荷高。

4. 安装配置

首先以NXP的i.MX6Q平台的编译器配置为例,
官方一般会提供如下压缩包
gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz
首先登陆Ubuntu系统,执行sudu su进入管理员权限,然后可以自己创建一个文件夹,也可以安装官方推荐的路径创建文件加。

mkdir  -p /opt/freescale/usr/local

然后解压工具包

tar  zxvf  gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz  -C  /opt/freescale/usr/local

接下来配置一下PATH环境变量,目的是在任意路径下都可以使用交叉编译器。
一种是编辑profile这个文件

vim  /etc/profile

在打开的文件末尾添加

export ARCH=arm  

export CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi- 

export PATH=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH 

然后按Esc进入命令模式,再输入冒号,在冒号后面输入wq,实现保存退出。

另外一种配置方法是

PATH=$PATH:/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin

输入 echo $PATH 可以查看PATH变量是否已经添加成功。

我们可以通过编译helloworld.c 来验证一下。

linux命令行下,执行vim helloworld.c,输入如下代码。

#include"stdio.h" 

int main() 
	{
    
    
		 printf("HelloLinux!\n");
		 return 0; 
	}

执行
arm-none-linux-gnueabi-gcc helloworld.c -o helloworld_arm
正常的话没有任何提示信息,执行ls命令后,可以看到多出来一个helloworld_arm 这个文件。下载到ARM板上后,
执行chmod 777 helloworld_arm
然后./helloword_arm
我们可以看到打印了一行 Hellolinux! 成功!

对于NXP LS1021A这个平台,由于他是cortex A7架构,编译器需要用另外一个。
这次我们采用网络下载的方式实现。

sudo apt-get install gcc-arm-linux-gnueabifh

十几分钟后,执行

arm-linux-gnueabihf-gcc -v

会打印一长串信息,说明安装成功。

继续

arm-linux-gnueabihf-gcc hello.c -o hello1021

把hello1021 下载到LS1021A的目标板上,
执行chmod 777 hello1021
然后./hello1021
我们可以看到打印了一行 Hellolinux! 成功!

猜你喜欢

转载自blog.csdn.net/malcolm_110/article/details/108252425