韦德国际1946英国 > 计算机网络 > 针对ARM创建交叉编译环境,搭建交叉编译环境

原标题:针对ARM创建交叉编译环境,搭建交叉编译环境

浏览次数:75 时间:2019-10-21

  1. 下载源文件和补丁,包含:

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

 

>Linux内核源码及相应的补丁

一、GCC简介:

The GNU Compiler Collection,日常简单称谓GCC,是风流倜傥套由GNU开荒的编写翻译器集,为啥是编写制定器集并不是编写翻译器呢?那是因为它不只扶助C语言编写翻译,还援助C , Ada, Objective C等好些个言语。别的GCC对硬件平台的支撑,能够所无所不在,它不唯有扶植X86管理器架构, 还协助ARM, OPPO 6七千, 一加 8800, Atmel AVWrangler, MIPS等计算机架构。

 

转载:

>binutils

二、GCC内部结构:

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

1. Binutils:它是大器晚成组开拓工具,包含连接器,汇编器和其它用于目的文件和档案的工具。关于Binutils的介绍能够参照他事他说加以考察Binutils简要介绍。【这些软件包信任于差别的指标机的阳台。因为不一样指标机的命令集是分歧样的,比方arm跟x86就不风姿浪漫致】

2. gcc-core:顾明之意是GCC的着力部分,那后生可畏部分是只含有c的编写翻译器及国有部分,而对另外语言【C 、艾达等】的支撑包必要别的安装,那也是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的安装:

既然GCC本人就是两个软件集合,那么那一个软件群集又怎么设置呢,因为那么些进度很复杂,作者也未尝设置过,但以此不是本文的严重性,就不讲了。但是英特网的《Linux深透定制指南》讲得可怜详尽,感兴趣的能够看意气风发看。

 

交叉编写翻译工具链是三个由编写翻译器、连接器和平消除释器组成的汇中共总支部委员会出意况,交叉编写翻译工具链首要由binutils、gcc和glibc 3个部分组成。不经常出于减小 libc 库大小的虚构,也足以用别的 c 库来顶替 glibc,举个例子 uClibc、dietlibc 和 newlib。建设构造交叉编写翻译工具链是二个相当复杂的进度,如若不想本人经验复杂繁杂的编译进度,网络有生机勃勃部分编写翻译好的可用的接力编写翻译工具链能够下载,但就以念书为目标来讲读者有供给学习自身塑造八个陆陆续续编写翻译工具链

>glibc

四、交叉编写翻译:

交叉编译(或交叉创设)是这么如日中天种进度,它在活龙活现种机器结构下编写翻译的软件就要另生机勃勃种截然两样的机械结构下推行。一个大范围的事例是在PC机上为运行在基于ARM、PowerPC或MIPS的指标机的编写翻译软件。幸运的是,GCC使得那如火如荼经过所面对的辛劳要比听上去小得多。

GCC中的日常工具常常都以透过在指令行上调用命令(如gcc)来实行的。在运用交叉编写翻译的景况下,那么些工具将依附它编写翻译的靶子而命名。比方,要采纳交叉工具链为ARM机器编译轻易的Hello World程序,你能够运维如下所示的一声令下:

运用如下命令编写翻译并测量检验这么些代码:

$ arm-linux-gcc -o hello hello.c

 

 

>glibc-linuxthreads

五、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交叉编写翻译工具链

针对ARM创建交叉编译环境,搭建交叉编译环境。这里可以品尝选拔创新的本子。编写翻译不可能透过时,以此使用较旧的版本。几十开掘新本子组合可以编写翻译成功,依旧要求测量检验建立的工具链是不是能够运用。

六、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不相同。

生气勃勃、GCC简介: The GNU Compiler Collection,平时简单称谓GCC,是风流洒脱套由GNU开辟的编写翻译器集,为何是编辑器集...

营造立外交关系叉编写翻译器的第三个步骤正是规定指标平台。在GNU系统中,每个目的平台都有三个引人瞩指标格式,那些新闻用于在创设进程中分辨要利用的两样工具的没有错版本。因而,当在贰个特定对象机下运营GCC时,GCC便在目录路线中查究包括该对象标准的应用程序路线。GNU的目的标准格式为CPU-PLATFORM-OS。比如x86/i386 目的机名叫i686-pc-linux-gnu。本章的目标是汇报创立基于ARM平台的时有时无工具链,所以指标平台名称叫arm-linux-gnu。

  1. 成立办事目录,设置情状变量,安装Linux头文件。

平时营造立外交关系叉工具链有3种办法:

03. 建设构造二进制工具包(binutils):binutils包中的工具常用来操作二进制目的文件。该包中最关键的三个工具就是GNU汇编器as和链接器ld。

艺术大器晚成:分步编写翻译和设置交叉编写翻译工具链所急需的库和源代码,最一生成交叉编写翻译工具链。该措施相对相比不方便,符合想深切学习创设立外交关系叉工具链的读者。假如只是想使用交叉工具链,建议利用方法二或措施三创设立外交关系叉工具链。

  1. 开创起来编写翻译器(bootstrap gcc):创造交叉编写翻译版本的GCC,须要交叉编写翻译版本的Glibc,而交叉编写翻译版本的Glibc是经过交叉编写翻译版本的GCC创造的。

方法二:通过Crosstool脚本工具来兑现贰回编写翻译生成交叉编写翻译工具链,该方式绝对于艺术意气风发要轻巧许多,况兼出错的空子也少之甚少,提出大部分情况下利用该办法创设立外交关系叉编写翻译工具链。

05. 成立C库(Glibc):那生机勃勃部编写翻译好的Glibc还不可能用,他只是第叁遍编写翻译所须要的工具。前边的编写翻译职业都亟需链接到那个库上。

 

  1. 创建全方位编写翻译器(full gcc):有了接力编写翻译本的Glibc,就足以创制完整版本的GCC了。

  2. 第二回创造C库:重新编写翻译Glibc,并把Glibc安装到一定的做事目录中。

方法三:间接通过网络(ftp.arm.kernel.org.uk) 下载已经成立好的交叉编写翻译工具链。该方法的长处不用多说,当然是简轻易单便捷,但还要该措施有一定的弊病正是局限性太大,因为究竟是旁人塑造好的,也正是固定的未有眼观四路,所以创设所用的库以致编写翻译器的本子可能并不切合您要编写翻译的前后相继,同期只怕会在利用时出现过多莫名的谬误,提出读者慎用此方法。

图片 1

对此差异的嵌入式目的付出进度来讲,搭建立外交关系叉编写翻译遇到的进度基本相仿,包含操作系统甚至连接器,编写翻译器、调试器在内的软件开荒工具。

 

八个安然照旧的linux下C研究开发条件包罗以下多个结合:

 

1:函数库glibc

它linux下C的严重性函数库

2:编译器GCC

3:系统头文书档案glibc_header

 

缺少系统头文书档案的话,比很多用到系统功用的C程序将不能编写翻译

交叉编写翻译工具须求由binutils,GCC,glibc多少个部分组成

 

(1)      
binutils:如火如荼套用来布局和选拔二进制的工具集,由上边多少个部分构成

  
as   GNU汇编器 
,将汇编语言编写翻译成二进制指标代码

  
GAS  linux的科班汇编器,它只可以编写翻译x86的汇编语言

  
ld  GNU连接器

  
add2line:地址转变为文件名或行号对,以便调节和测量检验程序

  
瓦斯p:汇编宏管理器

   mn:从指标代码文件中历数全部的变量(包罗变量值和变量类型),若无一点名目的文件,则默感觉a.out文件

  objcopy:该工具使用GNU BSD库,它能够把对象文件的开始和结果从意气风发种文件格式复制到另黄金年代种格式的对象文件

  obdump:展现指标文件音信

  size:列出指标模块或文件的代码大小

  strings:打字与印刷可打印的对象代码字符

  strip:废弃全数符合连接

  c filt:链接器ld使用该命令能够过滤C 符号和java符号,防止重载函数冲突

  gprof:呈现程序调用段的各个数据

时有时无开拓意况的创建步骤:

(1)下载源文件、补丁和确立编写翻译目录

(2)创建内核头文件

(3)创建二进制工具(binutils)

(4)建构起来编写翻译器(bootstrap gcc)

(5)建立C库

(6)组建全方位编写翻译器(full gcc)

(7)验证交叉编写翻译工具链

(8)制作交叉编写翻译器

应用方法如火如荼即日常的法子,具体如下:

1:下载源文件、补丁和创建编写翻译目录

(1)选定软件版本号:选取软件版本号时,要先看看glibc源代码中的INSTALL文件,此文件罗列了该版本的glibc编写翻译时所需的binutils和gcc版本号

  在编写翻译glibc时,要用到linux内核中的include目录的内核头文件,如若发掘有变量未有定义而产生编写翻译失利,就改动内核版本号,若无完全的把握保证改的基石改完全了,就毫无动内核,而是把基础的版本号减弱或上涨来适应glibc

工具链所需的源码包:

     
 Linux内核源码包:linux-2.6.XX.tar.bz2   (下载地址:

      
二进制工具集源码包:binutils-2.XX.tar.bz
(下载地址:

      
gcc源码包:gcc-3.x.x.tar.bz2   (下载地址:

      
c库源码包:glibc-2.x.x-tar.bz  (下载地址:

    
            glibc-linuxthreads-2.x.x.tar.bz

      
gdb源码包:gdb-6.x.tar.bz       (下载地址:)

下载gcc的补丁包,补丁包的后缀为“.patch”

下载内核的补丁包

 

 (2):塑造办事目录

   首先成立办事目录,专业目录就是在怎么样目录下创设立外交关系叉工具链,目录的创设日常从不特意的渴求,能够依附个体喜好建构。以下所建设构造的目录是小编自定义的

#cd opt/embedsky/

#mkdir arm_linux

再在这里个职业目录arm_linux下树立3个目录 build-tools、kernel 和 tools。具体操作如下:

# cd arm_linux

# mkdir build-tools kernel tools

其间各目录的功用如下。

   ● build-tools 用来贮存在下载的binutils、gcc、glibc等源代码和用来编写翻译这几个源代码的目录;

   ● kernel 用来寄存内核源代码及补丁

   ● tools 用来寄放在编写翻译好的接力编写翻译工具和库文件。

(3)构建情况变量(# vi etc/profile ,在profile文件中增加PATH路线)

该手续的指标是为了方便重复输入路线,因为重新操作每件一样的政工总会让人觉着很费力,即便读者不习贯使用景况变量就可以略过该步,直接输入绝对路径就足以。注明以下情状变量的目标是在后头编写翻译工具库的时候会用到,很有益输入,特别是足以裁减输错路线的风险。

# export PRJROOT=/ opt/embedsky/ arm_linux/

# export TARGET=arm-linux

# export PREFIX=$PRJROOT/tools

# export TARGET_PREFIX=$PREFIX/$TARGET

# export PATH=$PREFIX/bin:$PATH

注意,用export注解的变量是权且的变量,也正是当注销或改动了调控台,这几个情形变量就流失了,借使还亟需接受这个意况变量就非得重复export操作,所以不经常会很费劲。值得庆幸的是,意况变量也足以定义在bashrc文件中,那样当注销或转变调节台时,这么些变量就间接有效,就无须老是export那几个变量了。

系统布局和您的TAEGET变量的应和如下表

你能够在通过glibc下的config.sub脚本来知道,你的TA君越GET变量是不是被扶植,举个例子:

 


 

$./config.sub 
  arm-linux


 

arm-unknown-linux-gnu


 

在小编的条件中,config.sub 在 glibc-2.2.3/scripts 目录下。

英特网还恐怕有黄金时代对 HOWTO 可以参见,ARM 连串布局的《The GNU Toolchain for ARM Target
HOWTO》,PowerPC 体系布局的《Linux for
PowerPC Embedded Systems HOWTO》等。对TARAV4GET的挑选大概有辅助。

(4)复制创设交叉编写翻译遇到所需的源代码包到相应的目录下

  #cp
binutils-2.XX.tar.bz   /opt/embedsky/
arm_linux/

  #cp
gcc-x.x.x.tar.bz2     /opt/embedsky/
arm_linux/

  #cp
glibc-2.x.x-tar.bz    /opt/embedsky/
arm_linux/

  #cp
glibc-linuxthreads-2.x.x.tar.bz 
/opt/embedsky/ arm_linux/

  #cp
gdb-x.x.tar.bz      /opt/embedsky/
arm_linux/

  #cp
linux-2.6.XX.tar.bz2  /opt/embedsky/
kernel/

对应的补丁包也要联合拷贝过来

(5) 4. 营造编写翻译目录

为了把源码和编写翻译时生成的文件分别,通常的编写翻译职业不在的源码目录中,要另建一个目录来非常用于编写翻译。用以下的通令来构建编写翻译你下载的binutils、gcc和glibc的源代码的目录。

$cd /opt/embedsky/ arm_linux

$mkdir build-binutils
build-boot-gcc build-gcc build-glibc gcc-patch

其中:

build-binutils-编译binutils的目录

build-boot-gcc-编译gcc 运维部分的目录

build-glibc-编译glibc的目录

build-gcc-编写翻译gcc 全体的目录

gcc-patch-放gcc的补丁的目录

2:建构内核头文件

编写翻译器须要经过系统基本的头文件来猎取目的平台所协助的系统函数调用所急需的消息。对于Linux内核,最棒的秘籍是下载三个确切的基石,然后复制拿到头文件。需求对内核做二个中坚的布局来生成准确的头文件;可是,无需编写翻译内核

  
#cd /opt/embedsky/kernel

   解压内核源代码:

  
#tar xvfj linux-2.6.XX.tar.bz2 –C

   给基础打补丁(根据情形选拔):

 
#tar xvfj patch-2.x.x-rmkx.gz   ;解压源码包

  #cd
linux-2.6.x

 
#patch –p1< ../patch-2.x.x-rmkx

   编写翻译内核生成头文件:

    修改linux-2.6.x的makefile文件以对平台开展安插

   
#vi makefile

    修改makefile的开始和结果如下:

   
ARCH=arm CROSS_COMPIL=arm-linux-

    修改产生后保存,运维配置命令依据系统进行相关铺排

#make
menuconfig

此中ARCH=arm表示是以 arm为连串布局,CROSS_COMPILE=arm-linux-表示是以arm-linux-为前缀的交叉编写翻译器。也能够用config和 xconfig来代表menuconfig,推荐用make menuconfig,那也是基础开垦人员用的最多的配备形式。注目的在于布署时必定要选择管理器的类型,这里接收三星(Samsung)的S3C2410(System Type->ARM System
Type->/Samsung S3C2440)配置达成退出并保留,检查一下内核目录中的include/linux下是不是变动了autoconf.h和version.h。那是编写翻译glibc时要用到的,autoconf.h和version.h的文件存在,也作证了生成了道理当然是那样的的头文件

 

本文由韦德国际1946英国发布于计算机网络,转载请注明出处:针对ARM创建交叉编译环境,搭建交叉编译环境

关键词: 伟德19463331

上一篇:04编译运行Android,错误解决办法

下一篇:没有了