ARM-elf与ARM-linux的区别

发布者:梦幻之光最新更新时间:2021-06-30 来源: eefocus关键字:ARM-linux 手机看文章 扫描二维码
随时随地手机看文章

简介:在基于ARM的嵌入式系统开发中,常常用到交叉编译的GCC工具链有两种:arm-linux-*和arm-elf-*,两者区别主要在于使用不同的C库文件。


在基于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的说明,详见如下:


There are two libc libraries commonly used with uClinux. uC-libc anduClibc. They are quite different despite their similar names. Here is aquick overview of how they are different.


uC-libc is the original library for uClinux. It was based on sourcesfrom the Linux-8086 C library which was part of the ELKs project withm68000 support added by Jeff Dionne and Kenneth Albanowski. It is afairly complete libc implementation, however, some of the API's are alittle non-standard and quite a few common libc routines are notpresent. Currently it has stable support for m68000, ColdFire and ARM(Non-MMU) architectures. It was primary design goal is to be small andlight weight. It does try to conform to any standards, although its APItries to be compatible with most libcs, it is not always exactly thesame.


The uClinux distribution provides an environment that can compileusing either uC-libc or uClibc depending on your needs. For m68000 andColdfire platforms it is generally better to chose uC-libc as itsupports shared libraries and is the most commonly used libc for theseCPUs. uClibc also works quite well with almost all platforms supportedby the distribution. Which libc you choose to use will be decided byyour requirements


uClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差别,下面就简单的介绍一下二者的不同之处。uC-libc是最早为uClinux开发的库,是Jeff Dionne和KennethAlbanowski为在EKLs项目中支持m68000在Linux-8086C库源码上移植的。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的标准也没有实现。uC-libc稳定地支持m68000,ColdFire和没有MMU的ARM。其主要设计目标是“小”、"轻",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并不像它期望的那样和所有标准一致。


uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确的返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到多种架构中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。uClibc能够在标准的VM linux和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,因为同样使用Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。


arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib等其他C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等能使得系统程序更加小巧快捷。


关键字:ARM-linux 引用地址:ARM-elf与ARM-linux的区别

上一篇:基于Linux和MiniGUI的某型指控终端人机接口设计
下一篇:ARM单片机开发经验点滴

推荐阅读最新更新时间:2024-11-07 17:52

基于ARM-Linux的MiniGUI的仿真与移植
  近几年,随着嵌入式系统的日益发展和32位嵌入式处理器以及图形显示设备的广泛应用,目标产品对GUI(图形用户界面)的需求越来越多。由于嵌入式系统一般实时性要求很高,所以嵌入式系统下的GUI需要具有轻量级型、占用资源少、高性能等特点。此外,嵌入式系统往往是一种定制设备,它对GUI的需求各不相同,因此,GUI必须也可以定制。而MiniGUI是一个非常适合实时嵌入式产品的高效、可靠、可定制、小巧灵活的图形用户界面支持系统,被广泛的应用于高端科技产品中。利用MiniGUI开发出良好的人机交互界面已成为嵌入式开发中的迫切需求。本文实现了在ARM-Linux环境下进行基于QVFB的MiniGUI的模拟开发、调试,通过在PC机上的仿真模拟,将
[嵌入式]
ARM-Linux驱动--ADC驱动(中断方式)
硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内核版本:2.6.39 原创作品,转载请标明出处: http://blog.csdn.net/yming0221/archive/2011/06/26/6568937.aspx 这个驱动写了好久,因为原来的Linux内核编译的时候将触摸屏驱动编译进内核了,而触摸屏驱动里的ADC中断在注册的时候类型选择的是 IRQF_SAMPLE_RANDOM,不是共享类型,所以,自己写的ADC驱动在每次open的时候,总提示ADC中断注册失败。 解决方案: 重新配置内核,选择触摸屏驱动以模块的形式编译,而不是直接编译进内核,这样Linux在
[单片机]
<font color='red'>ARM-Linux</font>驱动--ADC驱动(中断方式)
ARM-Linux s3c2440 之UART分析(三)
回顾一下上文,s3c2440串口底层驱动围绕三个数据结构展开: UART特定的驱动程序结构定义:struct uart_driver s3c24xx_uart_drv; UART端口结构定义: struct uart_port s3c24xx_serial_ops; UART相关操作函数结构定义: struct uart_ops s3c24xx_serial_ops; 实现了这三个数据结构体,基本完成了驱动操作函数的实现,紧接着需要对串口设备及设备驱动进行初始化,首先是模块初始化module_init(s3c24xx_serial_modinit): static int __inits3c24xx_serial
[单片机]
ARM-Linux驱动移植--Linux下烧写工具DNW和USB驱动安装
主机平台:Gentoo Linux 11.2 with linux kernel 3.0.6 硬件平台:FL2440(S3C2440)with linux kernel 2.6.35 原创作品,转载请标明出处 http://blog.csdn.net/yming0221/article/details/7211396 1、首先下载DNW for linux http://download.csdn.net/source/1011140 2、解压文件 、 3、编译主机的USB驱动 make -C /lib/modules/`uname -r`/build M=`pwd` modules 然后insmod
[单片机]
<font color='red'>ARM-Linux</font>驱动移植--Linux下烧写工具DNW和USB驱动安装
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved