arm交叉编译环境搭建

发布者:Amybaby最新更新时间:2016-04-11 来源: eefocus关键字:arm  交叉编译  环境搭建 手机看文章 扫描二维码
随时随地手机看文章
arm交叉编译环境搭建
今天搭建了一个基于arm的嵌入式开发环境,特记录搭建过程及其中遇到的问题。

一:准备
1、使用的软件版本
kernel:(http://www.kernel.org/pub/linux/kernel/v2.4/)
linux-2.4.21.tar.gz
(patch下载地址:ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)
patch-2.4.21-rmk1.gz

binutils:(ftp://ftp.gnu.org/gnu/binutils)
binutils-2.14.tar.gz

gcc:(ftp://ftp.gnu.org/gnu/gcc)
gcc-core-2.95.3.tar.gz
gcc-g++-2.95.3.tar.gz
(patch下载地址:http://www.linuxfromscratch.org/patches/downloads/gcc/)
gcc-2.95.3-2.patch
gcc-2.95.3-no_fixinc-1.patch
gcc-2.95.3-returntype_fix-1.patch

glibc:(ftp://ftp.gnu.org/gnu/glibc)
glibc-2.2.4.tar.gz
glibc-linuxthreads-2.2.4.tar.gz

gdb:(ftp://ftp.gnu.org/gnu/gdb)
gdb-6.0.tar.bz2

二:建立工作目录
#cd /
#mkdir crosstool
#mkdir linux-2.4.21 binutils gcc glibc gdb

把下载的源代码的压缩文件放入对应的文件夹:
/crosstool/linux-2.4.21:linux-2.4.21.tar.gz、patch-2.4.21-rmk1.gz
/crosstool/binutils:    binutils-2.14.tar.gz
/crosstool/gcc:         gcc-core-2.95.3.tar.gz、gcc-g++-2.95.3.tar.gz、gcc-2.95.3-2.patch、gcc-2.95.3-no_fixinc-1.patch、gcc-2.95.3-returntype_fix-1.patch
/crosstool/glibc:       glibc-2.2.4.tar.gz 、glibc-linuxthreads-2.2.4
/crosstool/gdb:         gdb-6.0.tar.bz2

三:建立二进制工具
#cd /crosstool/binutils
#tar -xvzf binutils-2.14.tar.gz
#cd binutils-2.14
#mkdir build-arm-linux
#../binutils-2.14/configure --target=arm-linux --prefix=/usr/local/arm/2.95.3
#make
#make install
--target 选项是指出交叉工具的体系结构,所有运行在主机上的交叉工具都要
配置这个选项。
--prefix 选项是指定路径前缀,编译完成之后,将安装到这个目录下。

要使用这些工具,我们必须在 linux 的启动脚本中添加如下环境变量:
#vi /etc/profile
在 profile 文件中添加如下 PATH 环境变量:
pathmunge /usr/local/arm/2.95.3/bin
保存。
使用source /etc/profile使修改生效。

四:建立gcc编译器(初始编译器)
#cd /crosstool/gcc
#tar -xvzf gcc-core-2.95.3.tar.gz
#tar –xvzf gcc-g++-2.95.3.tar.gz
#cd gcc-2.95.3
#patch -p1< ../gcc-2.95.3-2.patch
#patch -p1< ../gcc-2.95.3-no_fixinc-1.patch
#patch -p1< ../gcc-2.95.3-returntype_fix-1.patch

配置 t-linux 文件。因为我们现在还没有 glibc 库的支持,所以需要简单配置一些简单的选项。对于arm-linux 工具可以通过修改
/crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux 配置文件。
编辑 t-linux 文件,在文件末尾加入如下 2 行:
#vim /crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux
TARGET_LIBGCC2-CFLAGS += -Dinhibit_libc -D__gthr_posix_h
T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h
-Dinhibit_libc 的意思是禁止使用 libc,因为现在还没有编译出 glibc 库。

#mkdir build-arm-linux
#cd build-arm-linux
#../configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include --disable-shared –disable-threads –enable-languages="c"

该编译命令中:
--target 指定交叉编译工具的目标体系结构是 arm-linux
--prefix 指定安装路径为/usr/local/arm/2.95.3
--with-headers 指定内核头文件所在的路径为:/crosstool/linux-2.4.21/linux-2.4.21/include
--disable-shared 选项指定不使用共享库,这样就不依赖 glibc 了
--disable-threads 选项指定不使用线程,也就不使用线程库了。
--enable-languages 指定仅支持 c 语言

#make
在make的时候出现错误,在/crosstool/gcc/gcc-2.95.3/gcc/config/arm目录下的arm.c文件中,“arm_prog_mode = TARGET_APCS_32 ? PROG_MODE_PROG32 : PROG_MODE_PROG26;”句报错。可以将其注销。可以正常编译。
#make install

五:生成glibc库
#cd /crosstool/glibc
#tar -xvzf glibc-2.2.4.tar.gz
#cd glibc-2.2.4
#tar -xzvf ../glibc-linuxthreads-2.2.4.tar.gz
#mkdir build-arm-linux
#cd build-arm-linux
#CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld ../configure --host=arm-linux --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include/ --enable-add-ons=linuxthreads –enable-shared --prefix=/usr/local/arm/2.95.3/arm-linux

CC=arm-linux-gcc 是把 CC 变量设成你刚编译生成的 arm-linux-gcc,用它来编译你的glibc。
--host 指定目标板的体系结构
--with-headers 指定内核头文件的路径为/crosstool/linux-2.4.21/linux-2.4.21/include
--enable-add-ons=linuxthreads 支持线程库。
--enable-shared 选项支持共享库
--prefix 指定工具链目标板相关文件的目录

#make
#make install

此时在/usr/local/arm/2.95.3/arm-linux 目录下的 lib 等目录中,安装了 glibc共享库等文件。然后修改/usr/local/arm/2.95.3/arm-linux/lib/目录下的libc.so文件:

#vim /usr/local/arm/2.95.3/arm-linux/lib/libc.so

将“GROUP ( /usr/local/arm/2.95.3/arm-linux//lib/libc.so.6 /usr/local/arm/2.95.3/arm-linux//lib/libc_nonshared.a )”
修改为
“GROUP ( libc.so.6 libc_nonshared.a )”
这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib 目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。

如果不这样修改,会在后面第六步建立g++编译器的时候报错。(/crosstool/gcc/gcc-2.95.3/build-arm-linux/arm-linux/libiberty目录下找不到Makefile文件。)
出现编译错误问题。

六:建立全套编译器(gcc和g++)
#cd /crosstool/gcc/gcc-2.95.3

首先,将我们添加的2行-Dinhibit_libc去掉,因为此时不需要禁止使用libc了,我们在第 5 步中已经生成了libc。
#vim gcc/cpmfog/arm/t-linux

然后,进入 build-arm-linux 清除临时目录及临时文件。
#cd build-arm-linux
#make distclean
#rm –rf ./*

#../configure –target=arm-linux --prefix=/usr/loacal/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux2.4.21/include --enable-threads=pthreads --enable-shared --enable-static --enable-languages="c,c++"
#make
#make install

最后在/usr/loacal/arm/2.95.3/bin目录多了arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++几个文件

七:验证交叉编译工具
#cd /crosstool/
#mkdir test
#cd test
#vim helloworld.c

#include

int main(void)
{
        printf("Hello World!n");
        return 0;
}

#arm-linux-gcc helloworld.c -o helloworld
#file helloworld
helloworld: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
表示编译了一个能在 arm 体系结构下运行的helloworld程序,说明编译工具做成功了。



八:其它制作交叉编译环境的方法
    1、使用的工具
       crosstool-0.43.tar.gz          
       Download URL:http://kegel.com/crosstool/crosstool-0.43.tar.gz

    2、需要下载的源代码(以制作arm-linux gcc-4.1.1为例子)
       binutils-2.16.1.tar.bz2         
       Download URL:http://ftp.gnu.org/gnu/binutils/

       glibc-2.3.2.tar.bz2             
       Download URL:http://ftp.gnu.org/gnu/glibc/

       glibc-linuxthreads-2.3.6.tar.bz2
       Download URL:http://ftp.gnu.org/gnu/glibc/

       linux-2.6.25.tar.bz2            
       Download URL:http://ftp.kernel.org/pub/linux/kernel/v2.6/

       gdb-6.5.tar.bz2                 
       Download URL:http://ftp.gnu.org/gnu/gdb/

       gcc-4.1.1.tar.bz2               
       Download URL:http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/

       gcc-3.3.6.tar.bz2               
       Download URL:http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/

       linux-libc-headers-2.6.12.0.tar.bz2
       glibc-linuxthreads-2.3.2.tar.bz2

    3、注意事项
       您可以事先下载相关源代码到本地机器,也可以不用下载,因为在编译的时候,会自动下载相关的文件到本地文件夹。但是,那样的话,编译速度会很慢的。所以,这里推荐事先将这些源代码给下载下来。
       编译需要在非root用户下才可以进行。如果您是root用户,请您切换到普通用户模式。

    4、操作流程
[test@localhost ~]$ echo $HOME
/home/test
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$

可见,当前用户为test,当前所在目录为/home/test。

[test@localhost ~]$ mkdir download crosstool-4.1.1
[test@localhost ~]$
创建download 和 crosstool-4.1.1文件夹;然后将下载好的源代码放置到download文件夹中。

[test@localhost ~]$ tar -zxvf crosstool-0.43.tar.gz
[test@localhost ~]$ cd crosstool-0.43
[test@localhost crosstool-0.43]$
解压crosstool-0.43,然后进入crosstool-0.43目录。

[test@localhost crosstool-0.43]$ vim demo-arm.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
TARBALLS_DIR=/home/test/downloads
#RESULT_TOP=/opt/crosstool
RESULT_TOP=/home/test/crosstool-4.1.1
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES

............

#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest

echo Done.

*********************************************
修改TARBALLS_DIR和RESULT_TOP的值,同时添加语句“eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest”。
TARBALLS_DIR:是下载的工具源码压缩包的存放目录。
RESULT_TOP  :是要生成的工具链的存放目录,要有写权限的目录,不然无法编译。

[test@localhost crosstool-0.43]$ vim gcc-4.1.1-glibc-2.3.2.dat
*********************************************

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.25
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5

*********************************************
将“LINUX_DIR=LINUX_DIR=linux-2.6.15.4”修改为“LINUX_DIR=LINUX_DIR=linux-2.6.25”;

[test@localhost crosstool-0.43]$ vim arm.dat
*********************************************

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"

*********************************************
将“TARGET=arm-unknown-linux-gnu”修改为“TARGET=arm-linux”

[test@localhost crosstool-0.43]$ ./demo-arm.sh
执行编译操作。生成的工具链在如下的位置:/home/test/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2,也就是我们刚才建立的crosstool-4.1.1文件夹中。

九:后记
那些组合可以编译成功,可以参考:http://kegel.com/crosstool/crosstool-0.43/buildlogs/表格
关键字:arm  交叉编译  环境搭建 引用地址:arm交叉编译环境搭建

上一篇:关于arm-linux-gcc的安装与配置
下一篇:Keil C51 与 ARM 并存方法

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

如何理解ARM异常、中断和向量表
以前,我一直很疑惑这个“ARM异常、中断以及他们的向量表”是怎么回事,他们到底是怎么实现的,没有想到今天偶然看到(ARM System Developer's Guide: Designing and OpTImizing System Software的ARM异常、中断以及他们的向量表的章节,豁然开朗。——ARM嵌入式系统开发:软件设计与优化的英文原版——我个人感觉这是国内翻译ARM书籍最好的一本之一,比杜XX的ARM体系结构与编程好千倍。 本书虽然说软件设计与优化,但是讲的硬件也很多,比如MMU和cache等,讲的精彩纷呈:我刚才想写关于MMU和cache的博客,发现太庞大,看来这段时间要重新看看这本书才能写。 —
[单片机]
如何理解<font color='red'>ARM</font>异常、中断和向量表
飞思卡尔16位单片机(二)开发环境搭建及新建、调试工程
一、安装CodeWarrior 飞思卡尔16位单片机的开发环境为CodeWarrior5.1,这个软件安装比较简单,软件的安装文件可以从相应的网站上下载。安装CodeWarrior所需要的电脑的硬件资源也比较宽泛,目前一般的电脑都可以满足这个要求,可以支持win10、win7等操作系统。安装过程按照按照软件的提示一步步操作即可。 二、安装USBDM驱动 USBDM是飞思卡尔16位单片机的少些代码及调试程序的工具。飞思卡尔16位单片机可以支持多种调试工具,典型的有官方的调试器和开源的USBDM调试器,由于开源的调试器版本比较多,不同版本驱动的安装方法也不相同,所以USBDM驱动的安装需要参考厂家的使用说明进行。安装
[单片机]
飞思卡尔16位单片机(二)开发<font color='red'>环境</font><font color='red'>搭建</font>及新建、调试工程
兆易创新与IAR Systems 深化合作,释放Arm和RISC-V更大潜力
2020年12月3日,IAR Systems®,面向未来的嵌入式开发软件工具与服务供应商,宣布与兆易创新,业界领先的半导体供应商继续深化合作,并为兆易创新GD32系列基于Arm Cortex®-M内核的MCU产品家族提供性能强大的解决方案。2020年6月,IAR Systems和兆易创新宣布了在RISC-V领域的合作伙伴关系。现在,两家公司已将合作关系进一步延伸至Arm领域,为兆易创新Arm® Cortex®-M3、Cortex®-M4、Cortex®-M23和Cortex®-M33 内核的MCU产品家族加强开发工具的支持,从而为众多行业用户提供高质量的嵌入式应用程序。 兆易创
[嵌入式]
兆易创新与IAR Systems 深化合作,释放<font color='red'>Arm</font>和RISC-V更大潜力
传苹果公司将推ARM架构Mac:配更大触摸板
   苹果公司正计划研发基于ARM架构的Mac电脑   新浪数码讯 5月27日上午消息,据法国网站MacBidouille报道,苹果公司正计划研发基于ARM架构的Mac电脑,并且该消息指出目前已经有ARM架构版本的iMac、Mac mini以及64位ARM四核处理器的13英寸MacBook笔记本。   消息称,这些基于ARM架构的Mac电脑已经研发已久,并配备了一个全新键盘,采用更大尺寸的Magic Trackpad触摸板。苹果公司甚至已经做好了随时发布的准备,但是近期似乎并不会有动作。   而其实早在2011年就已经有相关传闻,称苹果公司将从英特尔处理器转向ARM移动处理器,并表示如果英特尔不能
[手机便携]
基于ARM核处理器的机器人手臂控制系统
近年来,随着MEMS及相关技术的发展,微机器人领域已越来越来受人关注。但由于零件的尺寸很小,微机器人组件的装配需要很高的精确度,一般的装配方法无法满足要求。本文介绍了一个可进行微零件装配工作的机器人手臂控制系统的控制方法。 1 系统结构 考虑到多机器人手臂的使用,整个机器人控制系统由上位机与多个下位机组成。下位机即是手臂控制器,每个下位机控制一个机械手臂的伸缩运动。上位机即为控制终端,通过不同配件组装方式生成每个手臂的位置数据,并通过数据线传输给各个下位机,由下位机控制手臂到达目标位置并进行目标操作。整个系统的结构框图如图1所示。 1.1 机械结构 如图2所示,手臂控制器的机械结构由直流减速电机、手臂、螺杆、减速齿轮
[应用]
Arm刘澍:周易之后,从产品研发角度解读Arm中国
近日,在中国集成电路设计业2018年会期间,Arm中国产品研发副总裁刘澍接受了媒体采访。 2018年4月,Arm中国合资公司正式在深圳挂牌运营,中方投资占股51%,Arm公司占股49%,这家新公司除了接管Arm在国内的所有IP业务,还会针对中国有着特殊的支持。对此刘澍表示,Arm中国的剥离,真正实现了Arm的本土扎根。“我们要把所有的Arm技术带入中国,在中国建立长期自主研发体系,具有跟国际接轨的研发团队和能力,更好支持本土化产业发展的需要和中国自主可控技术的需求。”刘澍说道。 Arm中国产品研发副总裁刘澍 在大会期间,刘澍介绍了Arm中国成立以来的首款产品——周易人工智能平台,并表示未来Arm中国会投入更多的研发能
[半导体设计/制造]
<font color='red'>Arm</font>刘澍:周易之后,从产品研发角度解读<font color='red'>Arm</font>中国
ARM与GPRS技术的家居实时安防系统解析
设计了一个以32位ARM微处理器STM32F103C8T6为控制核心,外加振动传感器和热释红外传感器的实时安防系统。该系统处于工作状态时,能实时监控到是否有人进入监控区域,且实现自动发送彩信报警。系统采用微型图像传感器OV7670获取图像信息,并对图像进行初步处理,再利用GPRS模块SIM900发送彩信到指定手机,同时将获取的图像数据保存到SD卡內。实验结果表明,系统工作稳定,实现了设计目标。 引言 最近几年随着我国城镇化的快速推进,人们的居住环境得到了很大的提升,家中的各类贵重物品也越来越多。由于城市的流动人口相对复杂,因此家居防盗已经成为人们非常关注的问题,对于家居安防方面的研究国内外都有不少方案。而这些方案基本都采用了运行嵌
[单片机]
<font color='red'>ARM</font>与GPRS技术的家居实时安防系统解析
AI芯片,开战
春节也没有阻挡AI跨越的脚步,2月16日凌晨,美国OpenAI公司的视频生成模型Sora再次冲击AI界,成为继ChatGPT后又一现象级应用。Sora的问世令世人惊呼:现实不存在了。 短短几日,AI又掀起新一轮浪潮,而作为其核心动力的AI芯片,也迎来巨变。 打倒英伟达 看着英伟达赚钱,市场玩家分外眼红。为了抢占市场,巨头不惜砸大钱布局市场。 先是OpenAI首席执行官山姆·奥特曼(Sam Altman)万亿美元造芯片,再是自嘲为“秃头骗子”的孙正义1000亿美元造AI芯片。 山姆·奥特曼因为万亿美元而登上头条新闻,他曾表示半导体行业需要他,而建立庞大的芯片制造网络需要通过向全球投资者寻求大量资金,他则需要
[嵌入式]
AI芯片,开战
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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