使用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的编译器即可

你可能感兴趣的:(ubuntu)