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是与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 API's 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等能使得系统程序更加小巧快捷。

 

 

### 回答1: arm-none-linux-gnueabi-gcc 4.8.3 是一个用于编译运行在 ARM 架构的 Linux 系统上的交叉编译器gcc 是 GNU 编译器套件中的一个重要组件,它用于编译多种编程语言,包括 C、C++ 和 Fortran。arm-none-linux-gnueabi-gccgcc 的特定版本,用于交叉编译 ARM 架构上的应用程序。交叉编译是指在一种操作系统上生成适用于另一种操作系统或硬件平台上运行的可执行文件。 在 arm-none-linux-gnueabi-gcc 中,"arm" 表示该编译器是为 ARM 架构提供支持的,"none" 表示该编译器不针对特定的操作系统,"linux" 表示该编译器用于编译 Linux 操作系统上的应用程序,"gnueabi" 表示该编译器使用 GNU 工具链和 ELF 文件格式来生成应用程序。 版本号 4.8.3 表示该编译器的主要版本号是 4,次要版本号是 8,修订版本号是 3。版本号的升级通常意味着增加了新的功能、修复了已知的问题或提高了性能。 使用 arm-none-linux-gnueabi-gcc 4.8.3 编译应用程序时,我们可以通过相应的命令行选项指定编译目标以及其他所需的参数。由于它是一个交叉编译器,因此我们可以使用它在不同的操作系统上(如 Windows 或 macOS)编写并编译 ARM 架构的应用程序。编译完成后,生成的可执行文件可以在 ARM 架构的 Linux 系统上运行。 ### 回答2: arm-none-linux-gnueabi-gcc 4.8.3 是一个特定版本的 GCC 编译器,用于在 ARM 架构上编译运行 Linux 的应用程序。GCC 是 GNU Compiler Collection 的缩写,是一个开源的编译器套件,用于编写和运行 C、C++ 和其他支持的编程语言arm-none-linux-gnueabi 是 GCC 的一个目标后端选项,用于指定编译生成针对 ARM 架构的可执行程序。gnueabi 表示该编译器使用了 GNU C 库和一些 EABI(嵌入式应用二进制接口)的规范。 4.8.3 表示编译器的具体版本号。版本号通常包含主版本号、次版本号和修订号,用于标识编译器的重要更新和改进。具体版本的编译器可以选择更好的优化选项、修复已知的错误,并提供更好的兼容性和性能。 arm-none-linux-gnueabi-gcc 4.8.3 可能是为了满足某些特定的项目要求而开发的版本,也可能是该产品版本的标准推荐编译器。开发者可以根据项目需求选择合适的 GCC 版本,并使用相关命令进行编译、链接、优化和调试。 通过使用 arm-none-linux-gnueabi-gcc 4.8.3,开发者可以在 ARM 架构上编写高效、可靠和兼容的 Linux 应用程序。这些应用程序可以在嵌入式设备、移动设备和其他 ARM 架构的系统上运行,为用户提供强大的功能和灵活性。编译器版本号的选择取决于开发者对编译器功能和性能的需求,以及与其他软件组件和库的兼容性要求。 ### 回答3: arm-none-linux-gnueabi-gcc 4.8.3 是一个GCC编译工具链的版本,专门用于编译适用于ARM架构(arm-none-linux-gnueabi)的Linux操作系统。GCC是GNU编译器套件(GNU Compiler Collection)的缩写,它是一个广泛使用的开源编译器集合,支持多种编程语言arm-none-linux-gnueabi-gcc 4.8.3 的"arm-none-linux-gnueabi"部分表示目标平台为ARM架构的嵌入式设备,而"gnueabi"则表示使用了GNU(GNU is Not Unix)工具链,并且目标操作系统为Linux。因此,该编译器适用于开发基于ARM架构的嵌入式Linux应用程序。 版本号4.8.3表示该工具链的具体版本为4.8.3,版本号的更新通常意味着对新语言标准、性能改进和错误修复的支持。因此,arm-none-linux-gnueabi-gcc 4.8.3可能具有一些特定的新功能和改进之前版本的问题。此外,版本号对于确保编译生成的代码与其他开发工具和库保持兼容性也非常重要。 总而言之,arm-none-linux-gnueabi-gcc 4.8.3 是一个适用于ARM架构的嵌入式系统的GNU编译器工具链。它用于编译适用于ARM架构的Linux操作系统上的应用程序。版本号4.8.3表示该编译器的具体版本,版本号的更新通常带来新功能和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值