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区别

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【oracle 性能优化】组合索引之index_ss

    【oracle 性能优化】组合索引之index_ss

  • 深入分析ReentrantReadWriteLock读写锁

    深入分析ReentrantReadWriteLock读写锁

  • leetcode-50Pow(x, n)(快速幂)

    leetcode-50Pow(x, n)(快速幂)实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25 提示:-100.0 < x < 100.0-231 <= n <= 231-1-104 <=

  • TCP和UDP协议的区别_朋友关系

    TCP和UDP协议的区别_朋友关系在解释两者之间的关系之前,我们必须从宏观的角度了解互联网的整个交互模型。因为当了解互联网在大体上是如何运作时,我们才能了解HTTP和TCP存在的意义,包括他们所要解决的问题是。 (此图来自Udacity的网络协议教程)互联网的模型被分为4层,从上至下每一层都依赖其底层协议。换言之,Application(应用层)的协议操作成功的前提是Transport(运输层)的存在。没有运输层就没有应…

  • Win10下安装Ubuntu20.04双系统,看这一篇就够了

    Win10下安装Ubuntu20.04双系统,看这一篇就够了前言:既然你都找到这了,相信对Linux和Ubuntu已经有了一定的了解,这里就不再做过多的赘述,直接步入正题了。由于各种原因我已经反复装了七八遍的Ubuntu(从16.04到20.04都装过几次),发现不同版本的Ubuntu安装过程都大同小异,就决定拿最新版的20.04来和大家分享一下。由于安装过程中我不知道怎么截图,有些的配图是手机拍摄的,敬请谅解。…

  • 沟通和认同:自我的塑造与展现

    沟通和认同:自我的塑造与展现一、沟通和自我1、自我概念:指对自己所持有的相对稳定的知觉2、自尊:对自我价值的评估3、反映评价:我们每个人得出的自我概念反映的是我们认为别人看待我们的方式4、社会比较:依据与他人对照的方式评估自身5、自我概念是被周遭环境塑造出来的,塑造的过程以两种方式呈现:反映评价和社会比较6、自我概念的特征:6.1、自我概念是主观的(有些人长期乃至永久地经受着过度的自我怀疑和批判之苦)(当我们经历负面情绪的时候要比我们心情好时对自己更挑剔)6.2、自我概念抗拒改变7、接受一个

发表回复

您的电子邮箱地址不会被公开。

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