免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1315 | 回复: 0
打印 上一主题 下一主题

使用crosstool 制作arm-linux交叉编译器3.4.5 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-28 00:54 |只看该作者 |倒序浏览


    实际上,网上很容易就能找到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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP