arm-linux-gcc和arm-elf-gcc的区别

在基于ARM的嵌入式系统开发中,常用的交叉编译GCC工具链有两种:arm-linux-*和arm-elf-*。
两者的主要区别在于使用的C库文件不同。
arm-linux-*使用GNU的Glibc,而arm-elf-*一般使用uClibc/uC-libc或者REDHAT专门为嵌入式系统开发的C库newlib.Glibc。
uClibc/uC-libc和newlib都是C语言库文件,但是它们的使用领域不同。
Glibc是为PC开发的。
uClibc/uC-libc是一个兼容GlibcAPI的小型化C语言库,实现了Glibc的部分功能。

有关uClibc/uC-libc的说明,请参阅以下内容:uClinux.uC-libcanduClibc中常用的有两个libclibraries。
尽管名称相似,但它们完全不同。
这里是它们之间差异的快速概述。
 uC-lib是uClinux的原始库。
它基于来自SPA的Linux-8086库的源代码JeffDionne和KennethAlbanowski添加了m68000支持的ELK项目的rt。
它相当完整的lib实现,但是,一些API有点非标准,并且不存在一些常见的lib例程。
目前有68000、ColdFire和ARM(非MMU)架构的表支持。
它的主要设计目标是小而轻。
它尝试符合任何标准,尽管它的API尝试与大多数库兼容,但它并不总是完全相同。
ire平台通常最好选择euC-libcas它支持共享库,并且是这些CPU最常用的libc。
uClibc在发行版支持的几乎所有平台上也工作得很好。
您选择使用哪个libc将由您的要求决定uClinux有两个常用的libc库:uC-libc和uClibc。
虽然两者的名字很相似,但实际上还是有区别的。
下面简单介绍一下两者的区别。
uC-libc是最早为uClinux开发的库。
它是由JeffDionne和KennethAlbanowski在Linux-8086C库源代码上移植的,以支持EKLs项目中的m68000。
uC-libc是一个完整的libc实现,但是它的一些API是非标准的,并且一些libc标准没有实现。
uC-libc对m68000、ColdFire和不带MMU的ARM具有稳定支持。
其主要设计目标是“小”和“轻”,并尽量符合标准。
虽然它的API与许多libc兼容,但它似乎并不像预期的那样与所有标准保持一致。
uClibc是从uC-libc开发出来的,就是为了解决这个问题。
它的所有API都是标准的(正确的返回类型、参数等),它弥补了uC-libc中未实现的libc标准,并且现已移植到多种架构。
一般来说,它尽可能与glibc兼容,以便更容易使用uClibc重写应用程序。
uClibc可以在标准VMlinux和uClinux上使用。
为了简化应用程序,它甚至可以在许多支持MMU的平台上编译成共享库。
ErikAnderson在uClibc背后做了很多工作。
uClibc支持多系列处理器:m68000、Coldfire、ARM、MIPS、v850、x86、i960、Sparc、SuperH、Alpha、PowerPC和Hitachi8。
不断增加的平台支持表明uClibc可以轻松适应新的架构。
uClinux发行版提供了一个环境,允许您选择使用uC-libc或uClibc进行编译。
对于m68000和Coldfire平台,选择uC-libc稍微好一些,因为它支持共享库,而共享库是这些CPU经常使用的libc。
uClibc也适用于几乎所有平台。
您选择哪个libc取决于您的需要。
newlib是一个用于嵌入式系统的开源C语言程序库。
它由两个库组成:libc和libm。
它的特点是轻量、快速、可移植到许多CPU结构上。
newlib实现了许多复杂的功能,包括字符串支持、浮点操作、内存分配(如malloc)和I/O流函数(printf、fprinf()等)。
之中其中,libc提供了C语言库的实现,libm提供了浮点运算支持。
在为ARM交叉编译gcc编译器时,为gcc指定不同的配置选项时,使用的C语言库是不同的。
gcc编译器默认使用Glibc,也可以使用uClibc/uC-libc(基本兼容GlibcAPI)。
当使用--with-newlib时,gcc编译器不使用Glibc。
当Glibc不交叉编译时,可以使用--with-newlib禁用连接Glibc并编译bootstrapgcc编译器。
从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,所以它们对核心数据的处理没有太大区别。
因此,arm-linux-*和arm-elf-*的区别主要体现在C语言库的实现上,比如系统调用不同、函数集实现不同、ABI\启动代码不同、系统特性不同等。
对于arm-linux-*和arm-elf-*的使用没有绝对的标准。
排除不同库实现的差异,gcc可以编译任何系统。
arm-linux-*和arm-elf-*都可以用来编译裸机程序和操作系统,但是按照下面的描述,系统程序显得更加协调:arm-linux-*目标是运行Linux的ARM机器,这取决于指定的C语言库Glibc,因为也使用了Linux的Glibc,使得arm-linux-*在运行Linux的ARM机器上的编译更加和谐。
arm-elf-*是一个独立的编译系统,不依赖于指定的C语言库Glibc。
它可以使用newlib等其他C语言库,并且不需要操作系统支持。
当它使用一些为嵌入式系统设计的轻量级库时,使用C语言库来编译裸机程序(没有Linux等大型操作系统的程序),例如监控程序、bootloader等,可以使系统程序更小,快点。
Linaro预构建工具链确实支持硬浮点和软浮点。
您可以从https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08尝试:./arm-linux-gnueabihf-gcc-print-multi-lib默认配置是--with-arch=armv7-a--with-tune=cortex-a9--with-fpu=vfpv3-d16--with-float=hard--with-mode=thumbTousesoftfloating,youneedoptions:-marm-march=armv4t-mfloat-abi=soft.根据您的情况,请尝试将-march=armv5更改为“-march=armv4t”如果您想更改为con图tocortex-a8和armv5.You需要*将samples/linaro-arm-linux-gnueabihf/crosstool.config中的cortex-a9更改为cortex-a8*将contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch中的armv4t更改为armv5,然后按照说明存储进行操作构建工具链(contrib/linaro/doc/README.txt)顺便说一句:crosstool-ng-linarodoes不支持multilibforeglibc。
它使用UbuntuPrecise中的预构建sysroot。
如果fit不适合您,请使用http://crosstool-ng.org/中的最新crosstool-ng。

如何安装arm-linux-gcc

arm-linux-gcc是一款基于Arm架构的Linux平台碎片整理工具。
安装过程主要有以下几个步骤:-

通常的做法是先下载arm-linux-gcc安装包,也可以从网上下载arm-linux-gcc的源代码。

进入Linux,将当前目录设置为arm-linux-gcc下载目录,输入tar-xzfarm-linux-gcc-4.4.3.tar.gz,同时解压文件。
经过时间的腐烂,就有了一个可供选择的文件夹。
如下图所示:

在/usr/local/中创建一个名为arm的文件夹,并在终端中输入命令:cd/usr/local/并点击。
再次输入回车键:mkdirarm,创建arm目录并将文件夹属性更改为rwx最后输入命令:chmod777arm,如下图:

输入命令。
在Linux终端中:sudocp。
-r/opt/FriendlyARM/toolschain/4.4.3/usr/local/arm,并将之前解压的optip文件源代码复制到上一步创建的manual文件夹中

安装到这里就基本完成了,不过还需要注意以下几点:-

每次使用的时候不要输入arm-linux-gcc的完整路径。
需要修改环境变量$PATH。
通常需要在终端输入:sudogedit/etc/profile,打开profile文件,在最后一行添加“exportPATH=$PATH:/usr/local/arm/4.4.3/bin”并保存文件。
如图

结果,应输入:source/etc/profile。
然后输入echo$PATH即可看到环境变量如图:

最后输入arm-linux-gcc-v即可看到。
如果显示版本信息,出现下图版本信息则表示安装成功。