GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析

一、GCC简介:TheGNUCompilerCollection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持C语言编译,还支持C++,A

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

一、GCC简介:

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

 

二、GCC内部结构:

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

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

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

3. Glibc:包含了主要的c库,这个库提供了基本的例程,用于分配内存,搜索目录,读写文件,字符串处理等等。【这个包GCC编译生成的库,前辈们为了方便大家开发,就把Glibc放到GCC中】

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

#include<stdio.h>

int main(int argc, char *argv[])

{

printf("Hello Linux!!\n");

 

return 0;

}/* 何问起 hovertree.com */

 

$ gcc -o test test.c编译生成test可执行文件。gcc编译流程分为四个步骤:预处理、编译、汇编、链接。个人认为预处理和编译主要由gcc-core来完成,汇编和链接主要由Binutils来完成。那么何时用到glibc呢?看到源码中的printf函数没有,这个函数在GCC中是以库函数的形式存在,这个库函数在glibc库中,在stdio.h头文件中被声明。

总的来说,如果真正了解了上面3个软件包的作用,自然就明白GCC是如何工作的。

 

三、GCC的安装:

既然GCC本身就是一个软件集合,那么这些软件集合又怎么安装呢,因为这个过程很复杂,我也没有安装过,但这个不是本文的重点,就不讲了。不过网上的《Linux彻底定制指南》讲得非常详细,感兴趣的可以看一看。

 

四、交叉编译:

交叉编译(或交叉建立)是这样一种过程,它在一种机器结构下编译的软件将在另一种完全不同的机器结构下执行。一个常见的例子是在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交叉编译软件对与一个初级嵌入式工程师来说特别棘手,因为它需要安装多个软件包,而且安装过程中不能有半点差错,因为每个软件包都有它的依赖关系【换句话就是说安装某个软件包时,如果它的依赖软件版本太低或者没有安装都将导致该软件包安装失败】;嗯,废话不说了,入正题,下面是我摘自创建ARMlinux交叉编译环境的实践的一部分,详细的安装过程请参考原文或GOOGLE搜索之。

……

1、源文件准备 
binutils-2.14.tar.gz 
ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz 
gcc-core-2.95.3.tar.gz 
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz 
gcc-g++2.95.3.tar.gz 
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz 
glibc-2.2.4.tar.gz 
ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz 
glibc-linuxthreads-2.2.4.tar.gz 
ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz 
linux-2.4.21.tar.gz 
ftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz 
patch-2.4.21-rmk1.gz # linux kernel patch for arm 
ftp://ftp.arm.linux.org.uk/pub/l … atch-2.4.21-rmk1.gz 

binutils-2.14.tar.gz这个压缩包包含有ld,ar,as等一些产生或者处理二进制文件的工具。 
gcc-core-2.95.3.tar.gz这个压缩包是GCC的主体部分,GCC是GNU Compiler Collection的简称,顾名思义,它能够编译很多种高级语言,例如C、C++,Java等,而这个压缩包中含有C编译器,及公共部分,而对其他语言的支持,采用另外的压缩包单独发布。 
gcc-g++2.95.3.tar.gz,这个压缩包就是为使GCC能够编译C++程序而单独发布的。 
glibc-2.2.4.tar.gz,libc是很多用户层应用都要用到的库,kernel和bootloader不需要这个库的支持,这个库主体部分封装在这个压缩包内。 
glibc-linuxthreads-2.2.4.tar.gz,这是Libc用于支持Posix线程而单独发布的一个压缩包。 
linux-2.4.21.tar.gz,这个压缩包就是Linux的内核。 
patch-2.4.21-rmk1.gz,这个压缩包是用来给Linux内核打补丁,以使其可以支持ARM的硬件平台。

……

可以看出arm-linux-gcc跟GCC所需的安装包的名字大同小易,可这是为什么呢?不知道网友没有想到过这个问题,可能网友知道这些包跟GCC所用的包是不相同的,仅仅名字不一样而已,但是知道为什么不一样恐怕还是有相当多的人不清楚。个人认为要了解arm-linux-gcc与GCC的关系和区别,这个问题才是关键所在。好了,不卖关子了,入正题,因为我们知道X86跟ARM所使用的指令集是不一样的,所以所需要的binutils肯定不一样咯;上面提到过gcc-core是依赖于binutils的,自然ARM跟X86所使用的gcc-core包也不一样;glibc一个c库,最终是以库的形式存在于编译器中,自然ARM所使用的glibc库跟X86同样也是不一样的咯,其它的依此类推。

 

六、arm-linux-gcc和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。关于两者的区别,请参考arm-linux-gcc arm-elf-gcc区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120347.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用decode函数

    使用decode函数Decode函数使用:Oracle的decode函数蛮有意思,是oracle独有的,国际标准SQL中并没有decode函数。语法DECODE(col|expression,search1,result1[,search2,result2,…,][,default])例子SELECTproduct_id,DECODE(warehouse_id,1…

    2022年7月25日
    4
  • XPS文件转换为PDF不再愁!全新XPS/EPS文档处理神器Aspose.Page来啦!

    XPS文件转换为PDF不再愁!全新XPS/EPS文档处理神器Aspose.Page来啦!近月,针对Aspose.XPS和Aspose.EPS做了一些改动,将其合并成Aspose.Page,同样可以使用现有许可证访问这两种产品的所有功能。Aspose.Page(点击下载)是集成On-PremiseAPI,以.NET和Java应用程序中创建,操作或转换XPS,EPS和PS文件。或使用免费应用程序即时查看或转换文件。功能亮点Aspose.Page允许文档转换。例如,您可以将XPS…

    2022年5月4日
    70
  • 如何使用ccs软件创建工程

    这里简叙如何使用ccs软件创建工程的具体步骤,正文如下:1、打开ccs软件,单击菜单栏中的“Project”选项,在弹出的下拉菜单中选择“NewCCSProject”,如下图所示:  2、在“Projectname”中输入自定义的工程名称,在“Family”中选择所需DSP的系列,在“Variant”的目录下选择所需的DSP的型号,最后在“Connection”目录下选择仿真…

    2022年4月8日
    408
  • h2数据库使用(h2数据库生成的文件)

    h2数据库进入shelljava-cp../lib/h2-1.4.200.jarorg.h2.tools.ShellWelcometoH2Shell1.4.200(2019-10-14)ExitwithCtrl+C[Enter]jdbc:h2:~/testURLjdbc:h2:/usr/local/db/xxx-xxx[Enter]org.h2.DriverDriver[Enter]UserxxxxxxPasswo

    2022年4月12日
    41
  • linux查看80端口占用情况_netstat查看端口linux

    linux查看80端口占用情况_netstat查看端口linux前言平常使用linux,我们经常需要查看哪个服务占用了哪个端口,接下来就为大家介绍了2种Linux查看端口占用情况可以使用lsof和netstat命令。1.lsof-i:端口号用

    2022年7月31日
    4
  • 警惕钓鱼网站_进入钓鱼网站会怎样

    警惕钓鱼网站_进入钓鱼网站会怎样概述于今日某伙计,突然在大群里发布了一条大家感兴趣的通知,具体讲是一个在线的腾讯文档,如下图

    2022年8月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号