使用Crosstool 0.43 在ubuntu0.94上制作arm交叉编译器arm-linux-gcc .-阿里云开发者社区

开发者社区> 范大脚脚> 正文

使用Crosstool 0.43 在ubuntu0.94上制作arm交叉编译器arm-linux-gcc .

简介:
+关注继续查看

一。 保证ubuntu 上安装如下软件包

 

Bison
flex
build-essential
patch
libncurses5-dev

 

查看该软件包的依赖关系,可以看到以下内容:

$ apt-cache depends build-essential

 

安装软件包使用 $sudo apt-get install 软件包名

 

二。 Crosstool

Crosstool 是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http: //kegel.com/crosstool。用Crosstool构建交叉工具链要比分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源下所示。

表2.2  所需资源

安装包
 下载地址
 
crosstool-0.43.tar.gz
 http://kegel.com/crosstool
 
linux-2.6.15.4.tar.gz
 ftp.kernel.org
 
binutils-2.16.1.tar.bz2
 ftp.gnu.org
 
gcc-3.3.6.tar.gz
 ftp.gnu.org

 

gcc-4.1.tar.gz
 ftp.gnu.org 
 
glibc-2.3.2.tar.gz
 ftp.gnu.org 
 
glibc-linuxthreads-2.3.2.tar.gz
 ftp.gnu.org 
 
linux-libc-headers-2.6.12.0.tar.bz2
 ftp.gnu.org 
 

gdb6.5.tar.bz2

 

三。crosstoo 安装基本步骤

 

1.准备资源文件

首先从网上下载所需资源文件,然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/downloads目录下解压crosstool-0.43.tar.gz,命令如下:

# cd /home/zhoug/downloads(注$HOME = /home/zhoug)

# tar –xzvf crosstool-0.42.tar.gz

(

对于tar.bz2的文件,其解压命令

#tar -xjvf xxx.tar.bz2

)

2.建立脚本文件

# cd HOME/downloads/crosstool0.43

# cp demo-arm9tdmi.sh arm.sh

# sudo gedit 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   #资源下载目录
RESULT_TOP=/opt/crosstool             #编译工具最终生成目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                 # 定义支持C, C++语言
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 arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest --nounpack


echo Done

 

3..建立配置文件 

# gedit arm9tdmi .dat

----------------------------------------------------------------------------------------------------------

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux    # 编译生成的工具链名称
GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi"
TARGET_CFLAGS="-O"

 

----------------------------------------------------------------------------------------------------------

# gedit gcc-4.1.0-glibc-2.3.2-tls.dat

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"

----------------------------------------------------------------------------------------------------------

4.执行脚本

将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

# cd crosstool-0.43

# ./arm.sh 

 

5.设置环境变量

# sudo gedit /etc/bash.bashrc

export PATH=$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:

 

 

四。编译中出现的错误

 

1. 我机器上的gcc 版本是gcc 4.3.3 ,进行编译时出错。

   gcc 版本高或低,sudo apt-get remove gcc ,sudo apt-get install gcc-4.1 。由于ubuntu 可以安装多种版本的gcc.我只执行

   sudo apt-get install gcc-4.1。

   安装gcc-4.1后

   sudo rm /usr/bin/gcc            (删除GCC,它只是个到gcc-4.3.2的软连接文件)
   sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc        (建立GCC到gcc-4.1的软连接)

 

2. 错误如下:

make[2]: *** [/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 错误 1
bash: make[2]::找不到命令
make[2]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2/csu'
make[1]: *** [csu/subdir_lib] 错误 2
make[1]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc

 

解决方法:

修改如下文件:
gedit /crosstool0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h 
"Available extensions:/n"
"/n"
vim Demo-arm.sh
在工具链版本后加 --notest --nounpack

 

3.网上介绍的其他错误

1)《安装gcc后》安装了gcc-4.1之后,重新编译。心想这回好了吧?!不想,有出了以下错误: 
In file included from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
google后发现,原来是ubuntu将系统默认的shell设置成了dash (the Debian Almquist Shell),所以通过脚本生成的文件格式和bash的不一样,导致了编译错误。在使用了
ursa
的方法后问题解决。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh

 

2)今天在编译skyeye时又报错 
/usr/include/bits/fcntl2.h:51: 错误: 调用‘__open_missing_mode’,声明有错误属性:open with O_CREAT in second argument needs 3 arguments 
按理说在Fedora 10中都可以编译过的,在ubuntu下应该也没什么问题才对,可是偏偏出现这个问题。赶紧跟踪,首先对比两个版本的/usr/include/bits/fcntl2.h,发现没有区别,那么就是代码的问题了。改代码,报错是在612行 
if(!nf->writebuffer) 
free(nf->writebuffer); 
free(nf); 
提示是open有错,但是612行是free,注释掉前两行,居然误报成了free(nf),继续注释掉free(nf),终于,错误给出来了,是在519行的 if ((nf->fdump= open(dev->dump, FILE_FLAG)) 0) 
open在调用的时候只有两个参数,赶紧给加上个0777,代码成了 if ((nf->fdump= open(dev->dump, FILE_FLAG,0777)) 0) 
谢天谢地,终于编译通过了。

遇到arm-linux-ar堆栈溢出的问题

主要是4.3.2编译器的问题,改为4.1的编译器即可



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/archive/2012/04/02/2430084.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
javascript:使用document.getElementById读取数据为空分析
  今天写个网页,想在页面加载onLoad时,动态显示由后台其他程序传来的数据时,用document.getElementById获取控件对象总是为空。但是检查了这个id确实是存在的。在网上查阅一番后才知道了其中的原因。
853 0
使用容器编排工具docker swarm安装clickhouse多机集群
1.首先需要安装docker最新版,docker 目前自带swarm容器编排工具 2.选中一台机器作为master,执行命令sudo docker  swarm init [options] 3,再需要加入集群的集群上执行此命令   4.
3027 0
使用 PyCharm 添加 Django 项目
一、前置准备(PyCharm与Python的下载,已有的跳过)   1.首先下载PyCharm 地址:http://www.jetbrains.com/pycharm/   2.然后下载Python 地址:https://www.
1100 0
教程:如何使用Data Lake Analytics创建分区表
# 前言 [Data Lake Analytics ](https://www.aliyun.com/product/datalakeanalytics)(后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。
3034 0
在pycharm中使用git版本管理以及同步github
注意:首先你电脑必须安装git版本控制器(软件),在官网下载即可。 pycharm中使用git以及github很简单,首先在设置中搜索github: 点击右边的Create API Token,系统会要求输入你的github账号和密码,当你输入正确点击确认后会进行身份认证,认证成功后会创建一段TOKEN。
1242 0
Pycharm在Ubuntu14.04中的基本使用指南
前几天给大家分享了:如何在VMware虚拟机中安装Ubuntu14.04系统。今天给大家分享一下在Ubuntu14.04中如何简单的使用Pycharm。 1、启动Pycharm,将进入Pycharm的启动页面,如下图所示,等待启动完成。
1010 0
javascript之ProtoBuf在websocket中的使用
因为ProtoBuf的序列化效率和大小都非常好,所以它在网络通信上面应用越来越多;而webosocket也随着web3.0应用越来越广泛,而将这两个结合在一起的也会慢慢形成一种趋势;本人是为了测试自已写的一个C# websocket,所以在web上面结合pb也写了一个js实例: 1.
1913 0
+关注
2785
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载