您的位置 首页 IOT

arm-linux-gcc和arm-elf-gcc 差异

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

在根据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是与Glibc API兼容的小型化C言语库,完成了Glibc部分功用。

  关于uClibc/uC-libc的阐明,详见如下:

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

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

  The uClinux distribution provides an environment that can compile using either uC-libc or uClibc depending on your needs. For m68000 and Coldfire platforms it is generally better to chose uC-libc as it supports shared libraries and is the most commonly used libc for these CPUs. uClibc also works quite well with almost all platforms supported by the distribution. Which libc you choose to use will be decided by your requirements

译文:

uClinux有两个常常运用的libc库:uC-libc和uClibc。尽管两者姓名很类似,其实有不同,下面就简略的介绍一下二者的不同之处。uC -libc是最早为uClinux开发的库,是Jeff Dionne和Kenneth Albanowski为在EKLs项目中支撑m68000在Linux-8086 C库源码上移植的。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的渠道上被编译成同享库。Erik Anderson在uClibc背面做了许多的作业。uClibc支撑许多系列的处理器:m68000,Coldfire,ARM,MIPS,v850, x86,i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断添加的渠道支撑显现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(根本兼容Glibc API),当运用–with-newlib时,gcc编译器不运用Glibc。当没有穿插编译Glibc时,能够运用–with-newlib制止衔接Glibc而编译bootstrap gcc编译器。从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等能使得体系程序愈加细巧分心。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/264440.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部