gcc与arm-linux-gcc和arm-elf-gcc的关系是什么

  

gcc与arm-linux-gcc和arm-elf-gcc的关系是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。


转自:

<节>
 https://blog.csdn.net/ce123_zhouwei/article/details/8220664 
  

<强>一、GCC简介

GNU Compiler Collection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持C语言编译,还支持c++, Ada, Objective - C等许多语言。另外GCC对硬件平台的支持,可以所无所不在,它不仅支持X86处理器架构,还支持手臂,68000年摩托罗拉,摩托罗拉8800年AtmelAVR, MIPS等处理器架构。

<强>二,GCC的组成结构

GCC内部结构主要由Binutils, GCC核心,Glibc等软件包组成。

<李>

Binutils:它是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。关于Binutils的介绍可以参考Binutils简单介绍。这个软件包依赖于不同的目标机的平台。因为不同目标机的指令集是不一样的,比如手臂跟X86就不一样。

<李>

GCC核心:顾明之意是GCC的核心部分,这部分是只包含C的编译器及公共部分,而对其他语言(c++, Ada等)的支持包需要另外安装,这也是GCC为何如此强大的重要原因.gcc-core依赖于Binutils。

<李>

Glibc:包含了主要的C库,这个库提供了基本的例程,用于分配内存,搜索目录,读写文件,字符串处理等等.kernel和引导装载程序不需要这个库的支持。

举例描述下上面3个包是如何进行运作的。有一个C源文件测试。c源码如下:

<节>
 <代码> # include 
int主要(int命令行参数个数,char * argv [])
{
printf(“你好Linux ! ! \ n");
返回0;
}
  ,

编译命令为:gcc - o测试测试。c编译生成测试可执行文件.gcc编译流程分为四个步骤:预处理,编译,汇编,链接。个人认为预处理和编译主要由GCC核心来完成,汇编和链接主要由Binutils来完成。

那么何时用到glibc呢?看到源码中的printf函数没有,这个函数在GCC中是以库函数的形式存在,这个库函数在glibc库中,在它的。h头文件中被声明。
总的来说,如果真正了解了上面3个软件包的作用,自然就明白GCC是如何工作的。

<强>三、交叉编译

交叉编译(或交叉建立)是这样一种过程,它在一种机器结构下编译的软件将在另一种完全不同的机器结构下执行。一个常见的例子是在PC机上为运行在基于手臂,PowerPC或MIPS的目标机的编译软件。

幸运的是,GCC使得这一过程所面临的困难要比听起来小得多.GCC中的一般工具通常都是通过在命令行上调用命令(如GCC)来执行的。在使用交叉编译的情况下,这些工具将根据它编译的目标而命名。

例如,要使用交叉工具链为臂机器编译简单的Hello World程序,你可以运行如下所示的命令:使用如下命令编译并测试这个代码:arm-linux-gcc - o你好你好。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库源码上移植的。

gcc与arm-linux-gcc和arm-elf-gcc的关系是什么