Linux 系统下ARM Linux交叉编译环境crosstool工具

发布者:ShimmeringMoon最新更新时间:2016-06-16 来源: eefocus关键字:ARM  Linux  交叉编译环境  crosstool工具 手机看文章 扫描二维码
随时随地手机看文章
Linux 系统下ARM Linux交叉编译环境的建立目前流行的有三种途径。

一、使用别人编译好的开发工具链

cross-2.95.3.tar.bz2

arm-linux-gcc-3.3.2.tar.bz2

arm-elf-tools-20030314.sh。

其中arm-elf-tools 是专门用来编译uclinux内核的。我们常用的cross-cross-2.95.3,下载cross-2.95.3.tar.bz2 解压后放到/usr/local/arm 目录下设置下PATH即可使用,这是最方便快捷的方式,缺点是cross-2.95.3 GCC版本是2.95.3,版本较低,不能编译2.6版本的Linux内核和版本较高的u-boot。cross-2.95.3.tar.bz2一般是交叉编译2.4的linux内核的,而arm-linux-gcc-3.3.2.tar.bz2一般是交叉编译2.6版本的内核的。

二、自己动手慢慢编译。

这个方法是最麻烦的,需要下载很多源文件,步骤多比较繁琐,成功率不高,极其容易出错,即使是经验丰富程序员,自己编译一套完整的工具链也是很难成功的。

三、建立交叉编译工具的途径是使用 crosstool-0.43或buildroot来编译。

     如果是基于gcc和glibc来制作工具链,则使用crosstool来编译,如果要基于gcc和uClibc来制作工具链,可以使用buildroot来进行编译。

    uClibc比glibc小,在已有的接口上是兼容的,更适合嵌入式系统,单uClibc没包括glibc中的所以的接口实现。

 

使用crosstool工具(crosstool-0.43.tar.gz)

 

  $ tar zxvf crosstool-0.43.tar.gz

  $ cd crosstool-0.43

  $ cp glibc-2.3.6-version-info.h_err.patch  crosstool-0.43/patches/glibc-2.3.6/

 

/* glibc-2.3.6-version-info.h_err.patch为补丁程序*/

 

打开脚本demo-arm-softfloat.sh(具体使用那个sh文件根据硬件确定)

#!/bin/sh

# This script has one line for each known working toolchain

# for this architecture.  Uncomment the one you want.

# Generated by generate-demo.pl from buildlogs/all.dats.txt

 

set -ex

TARBALLS_DIR=$HOME/downloads             /*表示源码存放的位置*/

RESULT_TOP=/opt/crosstool                /*表示编译结果存放的位置*/

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"                   /*表示制作出的工具链支持C、C++语言,如果想支持其他语言可以在里面增加如java可以GCC_LANGUAGES="c,c++,java" */

export GCC_LANGUAGES

 

# Really, you should do the mkdir before running this,

# and chown /opt/crosstool to yourself so you don't need to run as root.

 

mkdir -p $RESULT_TOP                           /*建立目录*/

 

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest

eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest

/*这个是会生成的版本、注意gcc-3.4.5-glibc-2.3.6.dat、arm-softfloat.dat 和all.sh 他们是三个相关的shell文件,下面分别介绍*/

echo Done.

 

1、demo-arm-softfloat.sh中修改

TARBALLS_DIR=/work/tools/create_crosstools/src_gcc_glibc     /*修改源码存放的位置,包括gcc-3.4.5-glibc-2.3.6.dat 所包含的所有包,如果可以上网,执行$ ./demo-arm-softfloat.sh 后可以自行下载*/

RESULT_TOP=/opt/crosstool             /*修改编译结果存放的位置*/

 

2、arm-softfloat.dat

 

KERNELCONFIG=`pwd`/arm.config

TARGET=arm-softfloat-linux-gnu     /*编译出来的样式为arm-softfloat-linux-gnu ,把它修改成TARGET=arm-linux,编译出来的样式为arm-linux-gcc、arm-linux-ld等*/

TARGET_CFLAGS="-O"

GCC_EXTRA_CONFIG="--with-float=soft"

GLIBC_EXTRA_CONFIG="--without-fp"

 

3、all.sh

PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO/$TARGET}   

修改成

PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO}

/*把原来最终结果存放在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux下改为/work/tools/gcc-3.4.5-glibc-2.3.6/*/

其中TARGET在arm-softfloat.dat定义的

 

4、gcc-3.4.5-glibc-2.3.6.dat

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.4.5

GLIBC_DIR=glibc-2.3.6

LINUX_DIR=linux-2.6.8 (可以修改内核版本)

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"

 

以上所提到的就是生成交叉编译器所需要的压缩包的版本。

5、进入crosstool-0.43

 

$ cd crosstools-0.43

$ ./demo-arm-softfloat.sh

 

 /*执行,经过2、3小时后在/work/tools/目录下生成gcc-3.4.5-glibc-2.3.6子目录,交叉编译器、库、头文件都在里面,设置PATH环境变量即可*/

 

$ arm-linux-gcc –v  /*测试*/

可能的错误:
ubuntu中默认gcc的版本是,对于crosstools 0.43而言gcc可能太新了。
解决的办法很简单:装个gcc4.1,然后把/usr/bin/gcc的link由gcc4.2指向4.1即可。
sudo apt-get install gcc-4.1
ls -l /usr/bin/gcc   #你可以看看现在的gcc指向哪里
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc   
附录: 
binutils是二进制文件的处理工具,它主要包含了一些辅助开发工具,例如,objdump显示反汇编码、nm列出符号表、readelf显示elf文件信息及段信息、strip将不必要的代码去掉以减少可执行文件大小等。这些工具在嵌入式开发初期,尤其是在移植调试操作系统时非常有用。 
  gcc是编译工具,用来编译内核代码的工具,使用它可以编译汇编语言和c语言的程序,生成arm的代码。 
  glibc是链接和运行库,它的编译需要指定编译器为arm交叉编译器,否则编译出的glibc代码将会是同时有arm和x86代码的混合体。所有需要用到的工具都可以通过下载源码自行编译,然后在宿主机上进行安装,就可以建立起arm的交叉编译环境。
关键字:ARM  Linux  交叉编译环境  crosstool工具 引用地址:Linux 系统下ARM Linux交叉编译环境crosstool工具

上一篇:ARM Linux 3.x的设备树(Device Tree)
下一篇:在Ubuntu上建立Arm Linux 开发环境

推荐阅读最新更新时间:2024-03-16 14:57

基于ARM的非接触式安全驾驶预警系统方案设计
  0引言   随着居民汽车拥有量的逐年增加以及人们生活节奏的加快,因疲劳驾驶导致的交通事故数也逐年增加。全世界每年因交通事故而导致的死亡人数达60万,直接经济损失约125亿美元,这些事故中57%的灾难性事故与驾驶员疲劳驾驶有关。因此,研究和开发一套非接触式疲劳驾驶监测系统有着非常大的社会现实意义。   1系统硬件设计   本预警系统主要由微控制器、图像数据采集模块、 LED 预警模块、通信接口以及 电源模块 五大部分组成,如图1所示。根据处理速度和精度的要求,采用32位 ARM 处理器。为了减小对驾驶员的影响,更好地实现非接触式,本文选用了300万像素的 CMOS 摄像头OV3640模块,与CCD相比,CMOS具有灵敏度高、分辨率
[单片机]
基于<font color='red'>ARM</font>的非接触式安全驾驶预警系统方案设计
ARM 关键几个寄存器
图中缩写如下: R:Register;寄存器 PC:Program Counter;程序计数器 CPSR:Current Program Status Register;当前程序状态寄存器 SPSR:Saved Program Status Register;保存的程序状态寄存器 SP:Stack Pointer;数据栈指针 LR:Link Register;连接寄存器 SB:静态基址寄存器 SL:数据栈限制指针 FP:帧指针 IP:Intra-Procedure-call Scratch Register;内部程序调用暂存寄存器 ARM共有37个寄存器,可以工作在7种不同的模式。以下根据上图进行分类的说明: 未分组寄
[单片机]
<font color='red'>ARM</font> 关键几个寄存器
ARM MMU页表框架
先上一张arm mmu的页表结构的通用框图(以下的论述都由该图来逐渐展开): 以上是arm的页表框图的典型结构:即是二级页表结构: 其中第一级页表(L1)是由虚拟地址的高12bit(bits )组成,所以第一级页表有4096个item,每个item占4个字节,所以一级页表的大小为16KB,而在第一级页表中的每个entry的最低2bit可以用来区分具体是什么种类的页表项,2bit可以区分4种页表项,具体每种页表项的结构如下: 简而言之L1页表的页表项主要有两大类: 第一大类是指向第二级页表(L2页表)的基地址; 第二类直接指向1MB的物理内存。 在L1页表中每个表项可以覆盖1MB的内存,由于有4096K个选项
[单片机]
<font color='red'>ARM</font> MMU页表框架
基于ARM智能交通信号机控制板开发
1 引言   目前我国的城市交通控制主要还是靠道路交通信号控制机(以下简称信号机)。国内的信号机主要分为两类:一类采用8/16位单片机作为处理器,交通控制功能简单、方案单一,以RS 232或RS485为通讯方式,难以与控制中心联网以及实现区域交通协调控制等功能,不能适应现代化大路口交通控制的要求;另一类则是基于工控机或PC104,功能虽然强大,但由于工控机或PC104都是按通用计算机标准设计,并非专门针对信号机应用设计,该类信号机硬件结构复杂且很多功能并不需要,成本也高,国外的信号机(如西门子公司的2070和美国的EAGLE)开发起步早,水平高,已有各种自适应联网型信号机产品,但一般不适用于中国混合交通的实际情况,且价格昂贵,操
[单片机]
ARM:机器人将带来协助而非取代人类
集微网消息,根据ARM委托第三方针对全球近4000名消费者进行的独立调查显示,仅少数受访者认为人工智能的发展将导致机器人盛行,取代人类就业。 消费者对未来的愿景相当乐观,有61%的受访者认为自动化技术与AI的日渐盛行「会让社会变得更好」。 考虑到人工智能将在未来逐渐融入日常生活,30%的消费者认为这项发展最不利的因素是「人类的工作变少或被迫转行」。 但多数受访者仍抱持正面态度,认为机器人不会取代人类,而是增进人类多数工作的效率,并协助执行更多繁冗且危险的任务。 ARM全球营销暨品牌传播副总裁Joyce Kim表示,调查结果显示普遍对AI的乐观以及其对可能带来的商机非常振奋人心,但人们目前只触及AI所具备潜力的冰山一角,仍有庞
[手机便携]
ARM的7种工作模式及其切换
一、ARM体系的CPU有以下7种工作模式: 1、用户模式(usr):正常的程序执行状态 2、快速中断模式(fiq): 处理快速中断,支持高速数据传送或通道处理 3、中断模式(irq): 处理普通中断 4、管理模式(svc):操作系统使用的保护模式 5、系统模式(sys):运行具有特权的操作系统任务 6、数据访问终止模式(abt):数据或指令预取终止时进入该模式 7、未定义指令终止模式(und):未定义的指令执行时进入该模式 注解: 可以通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式; 除用户模式外,其余6种工作模式都属于特权模式; 特权模式中除了系统模式以外的其余5种模式称为异常模式; 大多数程序
[单片机]
<font color='red'>ARM</font>的7种工作模式及其切换
ARM指令集中常用的存储和加载指令
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下: LDR 字数据加载指令 LDRB 字节数据加载指令 LDRH 半字数据加载指令 STR 字数据存储指令 STRB 字节数据存储指令 STRH 半字数据存储指令 1、LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器, 存储器地址 LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的
[单片机]
基于ARM处理器的CAN-Ethernet通信模块实现
近20 年来工业测控系统发展的趋势是:分散控制和集中管理、标准化和开放性。工业测控系统从传统的集中测量控制系统转向网络化的集散控制系统。随着现场总线技术高速发展和标准化程度不断提高,以现场总线技术为基础的开放型集散测控系统—现场总线测控系统得到了广泛的应用。同时,以太网的应用也迅速向工业测控系统渗透,在工业自动化应用中异军突起。 这种趋势的出现与计算机技术、信息技术、网络通信技术的高速发展相关。现代工业系统信息交换的需求也已经从管理层内部迅速覆盖到控制、现场设备等各个层次,连接上层网络和现场总线的通信设备成为工厂自动化系统中的关键设备之一。CAN-Ethernet通信模块,是一种直接连接以太网和CAN现场总线的设备,有效解决了控制
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved