原创 交叉编译器的制作

2010-11-30 15:42 2117 1 1 分类: MCU/ 嵌入式
实际上,网上很容易就能找到arm-linux的交叉编译器,作者之所以要自制的原因在于,本人目前因课题需要所使用的mipsel交叉编译器的GLIBC版本较低(2.2.5),导致QT4,goahead2.1.8无法运行,而高版本的GLIBC的mipsel交叉编译器网上很不容易找到。本人搜了很久,才在一公司网站找到一个,版本很高,能够使用,见我的另一篇博文。
在使用Crosstool之前,笔者尝试按照一般书籍上交叉编译器的制作流程并参考完善的多篇文章,含正式发表的期刊论文,尝试了好多天都没有成功,不得不放弃,很是郁闷,一个简单的交叉编译器都搞不定,心里很不舒服,于是决定再试。
后来看到crosstool这个软件,据说不错,能够很方便的编译自己的交叉编译环境,于是尝试一下。参考了几篇网上的文章,尤其是其中的注意事项,本文也将注明。
去网站http://kegel.com 下载最新的配置脚本压缩包crosstool-0.43.tar.gz,该作者目前在Google工作。http://kegel.com/crosstool/crosstool-0.43.tar.gz



我们要编译的环境为 gcc-3.4.5-glibc-2.3.6

之所以没有选择别的版本,是因为笔者编译之前下载的是的gcc-3.4.6.tar.bz2出错,其中一个错误类似于下面的提示信息,于是将下面的脚本稍作修改。
../sysdeps/generic/s_fmax.c:28:
internal compiler error: in elim_reg_cond, at flow.c:3257
Please submit a full bug report,

i686-host_pc-linux-gnu-ar找不到的错误提示。


后来干脆下载gcc-3.4.5.tar.bz2重新试,很顺利,尽管中间有很多的编译警告,但起码最后成功了,至于其他版本是否可以,笔者没有一个一个去试,毕竟编译很花时间,笔者所用代码约1小时左右。

步骤如下:

先以root身份登陆Linux系统,建一个用户账号xuyc,设置密码123456,一下的编译过程必须在普通用户模式下运行,用root用户不行。


编译前需要下载一些软件,当然不下载也行,crosstool 会自动帮你下载,但crosstool用wget下载,速度会很慢,有一些Linux还没有该下载命令,所以最好在windows环境下通过专门的下载软件下载所需要的软件,然后通过winscp软件传到linux系统中。
根据后面脚本中说指定的的版本,下载软件及版本如下:
binutils-2.15.tar.bz2 从ftp://ftp.gnu.org 下载
glibc-linuxthreads-2.3.6.tar.bz2 从ftp://ftp.gnu.org 下载
glibc-2.3.6.tar.gz 从ftp://ftp.gnu.org 下载
gcc-3.4.5.tar.bz2 从ftp://ftp.gnu.org 下载
linux-libc-headers-2.6.12.0.tar.bz2 从
http://ep09.pld-linux.org/~mmazur/linux-libc-headers/
下载
linux-2.6.18.1.tar.bz2 从http://www.kernel.org 下载

仍以root身份登陆,在/home/mipsel下输入以下命令:

Mkdir downloads
Chown mipsel:mipsel downloads


解压缩
tar zxvf crosstool-0.43.tar.gz


1)arm.dat:
可以不做任何修改
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-unknown-linux-gnu #交叉编译软件的前缀,可以修改
TARGET_CFLAGS="-O"


2)demo-arm.sh:
压缩包以及安装路径必须在$HOME目录,否则报权限不够的错误.

#!/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=$HOME/crosstool #/此处做了修改,否则会报权限不够
#/叉编译环境安装在哪里,原来为/opt/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
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest

echo Done. #这是我们要编译的交叉环境的版本
echo Done.

3) gcc-4.1.0-glibc-2.3.6-tls.dat

# vi gcc-3.4.5-glibc-2.3.6-tls.dat
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.18.1
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"

笔者曾用binutils-2.19测试,编译过程中出现一些错误,已经记不清,所以,后来就直接下载了默认的binutils-2.15版本。Linux内核与默认的有所区别,只是因为该版本与目前笔者正在使用的内核版本一致,并没有其他原因。

4)最后在用户模式下执行demo-arm.sh就可以了
./demo-arm.sh

5)看看交叉编译生成的目录
Cd /home/xuyc/crosstool/gcc-3.4.5-glibc-2.3.6/arm-unknown-linux-gnu

[mipsel@localhost mipsel-unknown-linux-gnu]$ ls
[root@localhost arm-unknown-linux-gnu]# ls
arm-unknown-linux-gnu bin include lib man
arm-unknown-linux-gnu.crosstoolconfig.txt distributed info libexec tmp

6)笔者编写了hello程序,用此编译器编译后,的确能够在S3C2410开发板上运行。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86537/showart_1670098.html

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条