您的位置 首页 被动

浅析gcc、arm-linux-gcc和arm-elf-gcc的联系

一、GCC简介TheGNUCompilerCollection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为

一、GCC简介

The GNU Compiler Collection,一般简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器集而不是编译器呢?那是由于它不只支撑 C 言语编译,还支撑 C++, Ada,Objective C 等许多言语。别的 GCC 对硬件渠道的支撑,能够所无所不在,它不只支撑 X86处理器架构, 还支撑 ARM, Motorola 68000, Motorola 8800,AtmelAVR,MIPS 等处理器架构。

二、GCC的组成结构

GCC 内部结构首要由 Binutils、gcc-core、Glibc 等软件包组成。

  1. Binutils:它是一组开发东西,包含衔接器,汇编器和其他用于方针文件和档案的东西。关于 Binutils 的介绍能够参阅 Binutils 简略介绍。这个软件包依赖于不同的方针机的渠道。由于不同方针机的指令集是不相同的,比方 arm 跟 x86 就不相同。
  2. gcc-core:顾明之意是 GCC 的中心部分,这部分是只包含 c 的编译器及公共部分,而对其他言语(C++、Ada 等)的支撑包需求别的装置,这也是 GCC 为何如此强壮的重要原因 。gcc-core依赖于 Binutils。
  3. Glibc:包含了首要的 c 库,这个库供给了根本的例程,用于分配内存,查找目录,读写文件,字符串处理等等。kernel 和 bootloader不需求这个库的支撑。

举例描绘下上面 3 个包是怎么进行运作的。有一个 c 源文件 test.c 源码如下:

[plain]view plaincopy

print?

  1. #include
  2. intmain(intargc,char*argv[])
  3. {
  4. printf(“HelloLinux!!\n”);
  5. return0;
  6. }

编译指令为: gcc -o test test.c 编译生成 test 可履行文件。gcc 编译流程分为四个进程:预处理、编译 、汇编、链接。个人认为预处理和编译首要由 gcc-core 来完结,汇编和链接首要由 Binutils 来完结。那么何时用到 glibc 呢?看到源码中的 printf 函数没有,这个函数在 GCC 中是以库函数的方式存在,这个库函数在 glibc 库中,在 stdio.h 头文件中被声明。
总的来说,假如真实了解了上面 3 个软件包的效果,天然就理解 GCC 是怎么作业的。

三、穿插编译

穿插编译(或穿插树立)是这样一种进程,它在一种机器结构下编译的软件将在另一种彻底不同的机器结构下履行。一个常见的比如是在 PC 机上为运转在依据 ARM、PowerPC或 MIPS 的方针机的编译软件。走运的是,GCC 使得这一进程所面对的困难要比听起来小得多。GCC 中的一般东西一般都是经过在指令行上调用指令(如 gcc)来履行的。在运用穿插编译的情况下,这些东西将依据它编译的方针而命名。例如,要运用穿插东西链为 ARM 机器编译简略的 Hello World 程序,你能够运转如下所示的指令:运用如下指令编译并测验这个代码:arm-linux-gcc -o hello hello.c。

四、arm-linux-gcc

arm-linux-gcc 是依据 ARM 方针机的穿插编译软件,arm-linux-gcc 跟 GCC 所需的装置包不同,但仅仅是姓名不同罢了,这是为什么呢?

x86 跟 ARM 所运用的指令集是不相同的,所以所需求的 binutils 必定不相同;上面提到过 gcc-core 是依赖于 binutils 的,天然 ARM 跟 x86 所运用的 gcc-core 包也不相同;glibc 一个 c 库,终究是以库的方式存在于编译器中,天然 ARM 所运用的 glibc 库跟 x86 相同也不相同,其它的依此类推。

五、arm-elf-gcc

arm-elf-gcc 跟 arm-linux-gcc 相同,也是是依据 ARM 方针机的穿插编译软件。可是它们不是同一个穿插编译软件,两者是有差异的,两者差异首要在于运用不同的 C 库文件。arm-linux-gcc 运用 GNU 的 Glibc,而 arm-elf-gcc 一般运用 uClibc/uC-libc 或许运用 RedHat专门为嵌入式体系的开发的C库newlib。仅仅所运用的范畴不同罢了,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型化C言语库,完成了Glibc部分功用。

六、uClibc/uC-libc

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也简直和一切的渠道都能很好的作业。

newlib 是一个用于嵌入式体系的开放源代码的C言语程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到许多CPU结构上。newlib完成了许多杂乱的功用,包含字符串支撑,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等等)。其间libc供给了c 言语库的完成,而libm供给了浮点运算支撑。

七、C言语库的挑选

在为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/ziliao/beidong/262372.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部