Ubuntu8.04下安装交叉编译工具链
Ubuntu8.04下安装交叉编译工具链
建立嵌入式linux的基础是建立基于ARM平台的交叉编译工具链。通常构建交叉工具链有3种方法:
方法一[/b] [/b]分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。
方法二[/b] 通过Crosstool脚本工具来实现一次编译生成交叉编译工具链。
方法三[/b] [/b]直接从网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。
我认为方法一太复杂,容易出错,我做了一次没有成功,放弃了,方法三简单省事,但局限性大,不能编译新版本的U-boot和内核。因此我使用Crosstool工具在Ubuntu8.04下构建交叉工具链。
Ubuntu8.04作为桌面系统来说非常的棒,但用来开发嵌入式就比较郁闷了,因为有很多的库默认是不安装的。在开始之前如果电脑能联网的话先装两个软件包,命令如下:
sudo apt-get install build-essential[/b]
sudo apt-get install bison flex[/b]
下面是用crosstool-0.43制作交叉编译工具链的过程。
1、准备资源文件
下载crosstool-0.43.tar.gz。
下载地址:
[url=][color=#0000ff][/color][/url]
内核linux-2.6.10.tar.gz 下载地址:
[url=ftp://ftp.kernel.org/][color=#0000ff]ftp.kernel.org[/color][/url]
其他资源是:binutils-2.15.tar.bz2、gcc-3.3.6.tar.gz、gdb-6.5.tar.bz2、glibc-linuxthreads-2.3.2.tar.gz、linux-libc-headers-2.6.12.0.tar.bz2、gcc-4.1.0.tar.gz、glibc-2.3.2.tar.gz、linux-2.6.10.tar.gz。下载地址为:
[url=ftp://ftp.gnu.org/][color=#0000ff]ftp.gnu.org[/color][/url]
用户目录为davidchen,将crosstool-0.43.tar.gz在/home/davidchen目录下解压,命令如下:
$ cd /home/davidchen/crosstool-0.43
$ sudo tar –xvzf crosstool-0.43.tar.gz
将其他资源放在/home/davidchen/downloads目录下。
2、建立脚本文件
接着建立自己的编译脚本,起名为arm.sh,找一个最接近的文件demo-arm.sh
作为模板,将该脚本的内容复制到arm.sh。命令如下:
$ cd /home/davidchen/crosstool-0.43
$ cp demo-arm.sh arm.sh
$ sudo vi arm.sh
修改后的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/davidchen/downloads
RESULT_TOP=/home/davidchen/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="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 arm.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest
#eval `cat arm.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.2.2.dat` sh all.sh --notest
#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
echo Done.
其中RESULT_TOP=/home/davidchen/crosstool是为了编译时的操作全在davidchen用户的权限范围内。如果写的是/opt/crosstool,davidchen用户就没有权限进行操作,也就不能编译成功了。
3、建立配置文件
arm.dat文件主要用于定义配置文件、定义生成编译工具链的明晨以及定义
编译选项等。命令如下:
$ cd /home/davidchen/crosstool-0.43
$ sudo vi arm.dat
修改后arm.dat内容如下:
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"
gcc-4.1.0-glibc-2.3.2-tls.dat文件主要定义编译过程中所需要的库以及它定义的版本。命令如下:
$ cd /home/davidchen/crosstool-0.43
$ sudo vi gcc-4.1.0-glibc-2.3.2-tls.dat
修改后gcc-4.1.0-glibc-2.3.2-tls.dat内容如下:
BINUTILS_DIR=binutils-2.15
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10
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、需要注意的问题
(1)、我在编译时出现了错误,提示为:
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.
意思是说系统里面没有安装GCC或者GCC过于陈旧。但是我查了一下目前安装的软件包,GCC已经是最新的了呀!后来上网Google了一下,发现别人也有这种情况,但是真正的原因并非GCC版本太老,反而是因为太新了,以致crosstool-0.43不能识别。在glibc的configure脚本里会检查gcc的版本,当不是需要的版本就报错。在crosstool-0.43自己的patches目录下有一个 patch:
patches/glibc-2.3.3-allow-gcc-4.0-configure.patch,他会在编译glic-2.3.2的时候给这个configure文件先打补丁,那个补丁来修复这个bug,但是这个补丁文件也不是很好,其内容是:
--- glibc-2.3.3/configure.old Mon Mar 14 12:01:10 2005
+++ glibc-2.3.3/configure Mon Mar 14 12:02:03 2005
@@ -3899,7 +3899,7 @@
ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
- 3.[2-9]*)
+ 3.[2-9]*|4.[01]*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
即它只是增加了对4.0xxx或者4.1xxx的支持,还是不够,我现在用的是4.2.1因此还是会出错,因此,修改这个patch,改为3.[2-9]*|4.*)就可以过去了。命令如下:
$ cd /home/davidchen/crosstool-0.43/patches/glibc-2.3.2
$ sudo vi glibc-2.3.3-allow-gcc-4.0-configure.patch
(2)、编译再次出现了错误,内容如下:
In file included from version.c:33:
/home/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h:1:1: missing terminating " character
/home/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
/home/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h:4:1: missing terminating " character
make[2]: *** [/home/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 错误 1
make[2]:正在离开目录 /home/davidchen/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/davidchen/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2'
make: *** [all] 错误 2
原因是系统在编译生成version.o时候发现version-info.h文件有错误。version-info.h是由downloads目录下的glibc-2.3.2.tar.gz源文件解压后glibc-2.3.2/csu/目录下的Makefile执行后生成故错误可能发生在Makefile中。这个问题是由ubuntu8.04系统本身造成的。修改方法:解压glibc-2.3.2.tar.gz,找到glibc-2.3.2/csu目录下的Makefile,按如下修改:文件末尾有2处echo,
echo
"\"Compiled on a $$os $$version system" \
"on
`date +%Y-%m-%d`.\\n\"" ;; \
改为:
echo
"\"Compiled on a $$os $$version system" \
"on
`date +%Y-%m-%d`.\\\\n\"" ;; \
echo
"\"Available extensions:\\n\"";
改为:
echo
"\"Available extensions:\\\\n\"" \
保存并重新压缩为glibc-2.3.2.tar.gz覆盖原来downloads目录下的glibc-2.3.2.tar.gz,注意新建立的压缩文件是允许被程序直接执行的(右键单击选属性把允许被程序直接执行前面的框选上)。
参考网页:
[url=][color=#0000ff][/color][/url]
(3)、 编译过程中如果出现某个文件或文件夹为只读文件或者用户权限不够时,使用命令sudo chmod 777 Filename修改文件或文件夹的权限。
5、执行脚本
上面的步骤都弄好以后,开始执行arm.sh脚本来编译交叉编译工具。注意
不要以root用户执行。命令如下:
$ cd /home/davidchen/crosstool-0.43
$ ./arm.sh
经过两个小时左右的漫长编译后,会在/home/davidchen/crosstool目录下生成新的交叉编译工具。
6、添加环境变量
使用命令sudo su切换到root用户,在系统/etc目录下的bash.bashrc文件
的最后添加一行:
export PATH=/home/davidchen/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux
/bin:$PATH
保存并退出终端,再次打开终端就能使用arm-linux-gcc工具了,版本为4.1.0。命令为:arm-linux-gcc -v。
[b]本文来自ChinaUnix博客,如果查看原文请点:[/b][url]http://blog.chinaunix.net/u2/82816/showart_1329330.html[/url]
阅读(426) | 评论(0) | 转发(0) |