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

news/2024/7/20 11:34:43 标签: gcc, motorola, 编译器, linux内核, 工具, 汇编

GCCARM-LINUX-GCCARM-ELF-GCC浅析

一、GCC简介:

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

二、GCC内部结构:

GCC内部结构主要由Binutilsgcc-coreGlibc等软件包组成。

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

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;

}

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

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

三、GCC的安装:

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

四、交叉编译:

交叉编译(或交叉建立)是这样一种过程,它在一种机器结构下编译的软件将在另一种完全不同的机器结构下执行。一个常见的例子是在PC机上为运行在基于ARMPowerPCMIPS的目标机的编译软件。幸运的是,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-gccGCC所需的安装包的名字大同小易,可这是为什么呢?不知道网友没有想到过这个问题,可能网友知道这些包跟GCC所用的包是不相同的,仅仅名字不一样而已,但是知道为什么不一样恐怕还是有相当多的人不清楚。个人认为要了解arm-linux-gccGCC的关系和区别,这个问题才是关键所在。好了,不卖关子了,入正题,因为我们知道X86ARM所使用的指令集是不一样的,所以所需要的binutils肯定不一样咯;上面提到过gcc-core是依赖于binutils的,自然ARM跟X86所使用的gcc-core包也不一样;glibc一个c库,最终是以库的形式存在于编译器中,自然ARM所使用的glibc库跟X86同样也是不一样的咯,其它的依此类推。

六、arm-linux-gccarm-elf-gcc:

arm-elf-gccarm-linux-gcc一样,也是是基于ARM目标机的交叉编译软件。但是它们不是同一个交叉编译软件,两者是有区别的,两者区别主要在于使用不同的C库文件。arm-linux-gcc使用GNUGlibc,而arm-elf-gcc一般使用 uClibc/uC-libc或者使用REDHAT专门为嵌入式系统的开发的Cnewlib关于两者的区别,请参考arm-linux-gcc  arm-elf-gcc区别

七、参考资料

 工具链技术说明

 Gcc编译流程解析

 Linux高级程序设计》中的交叉编译

 创建ARMlinux交叉编译环境的实践

 arm-linux-gcc  arm-elf-gcc区别



http://www.niftyadmin.cn/n/1738505.html

相关文章

C++常用开发-工具包

我使用过的C工具包汇总 学会一点&#xff0c;补充一点... -------------------------------------------------------------------------------- C正则表达式开发&#xff1a;boost.regex CXML开发&#xff1a;libxml2 CJSON开发&#xff1a;jsoncpp --------------------…

ADO.NET访问SQL Server数据库

ADO.NET的对象主要包括Connection、Command、DataReader、DataAdapter、DataSet&#xff0c;ADO.NET访问数据库主要包括两个步骤&#xff1a;建立数据库连接、读取或更新数据。 一、建立数据库连接 Connection对象负责建立和控制用户应用程序和数据库之间的连接。所有的数据库…

ios coredata 获取最后一条数据_【iOS取证】解开你的钥匙串

对于从事手机取证工作的人来说&#xff0c;iOS的keychain(钥匙串)数据想必大家都有所了解&#xff0c;根据苹果公司的介绍&#xff0c;iOS设备中的Keychain是一个安全的存储容器&#xff0c;可以用来为不同应用保存敏感信息比如用户名&#xff0c;密码&#xff0c;网络密码&…

SQL Server 2008可视化设置外键

环境&#xff1a;SQL Server 2008 问题&#xff1a;可视化设置外键 解决&#xff1a;table->选中表->design->选中需要设置外键的字段->选择“关系”->选择"添加"->在表和列规范处选择右边省略号&#xff08;见图一&#xff09;->再选择相应关…

css3运动后留下轨迹尾巴_模拟的延时推移展现出50万年后银河系壮观的面貌

你知道吗&#xff1f;50万年后的夜空将完全不同。想象一下&#xff0c;抬头看见夜空中四万颗流星同时划过的壮丽景象吧&#xff01;如果你想看到这个景象&#xff0c;欧洲航天局(ESA)为你提供了两种选择&#xff1a;要么盯着夜空看大约50万年&#xff0c;因为我们的太阳系会稳定…

Abbirb120型工业机器人_工业机器人中常用的2种轴承,你,知道多少?

嗨喽&#xff0c;各位&#xff0c;交叉滚子轴承研究者带着各种宝贝又回来了&#xff0c;本研究者今天带给大家的是工业机器人2种常用轴承&#xff0c;一起来看看吧&#xff0c;→_→ &#xff0c;话不多说&#xff0c;一起来看满满的干货呀。等截面薄壁轴承和交叉圆柱滚子轴承是…

Windows下搭建Objective-C开发环境

最近打算针对iPhone、iPod touch和iPad开发一些应用&#xff0c;所以&#xff0c;需要开始学习Objective C&#xff08;苹果推出的类似C语言的开发语言&#xff09;。由于苹果的自我封闭的产业链发展模式&#xff08;从芯片、机器、开发语言、终端产品、服务&#xff09;的限制…