注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

过于理智的傻瓜

这是结束 也是开始

 
 
 

日志

 
 

crosstool安装详解  

2010-05-09 08:57:01|  分类: ARM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

经过n久的时间尝试,终于把crosstoo;平台搭建起来了,就此总结前人经验,与大家分享。

在此之前 你要安装bison,flex这两个软件包,否则可能出错

一:需要下载的五个文件:

Linux-2.6.10.tar.gz

Binutils-2.15.tar.bz2

Gcc-3.3.6.tar.gz

Glibc-2.3.2.tar.gz

Glibc-linuxthreads-2.3.2.tar.gz

Linux-libc-headers-2.6.12.0.tar.bz2

也可以在这下

Crosstool-0.43.tar.gz

(我全部在chinaunix开源下载中心下载,很快的)

二:建立工作目录

这里所有创建的目录都必须在user用户状态下,在root状态下创建,并执行编译会提示:it's dangerous

在/home/user 目录下创建自己的crosstool目录 ,在/home/user/crosstool目录下创建 download(用来放你所下载的五个文件) 和 toolchain(放置你编译生成的arm-linux编译器)两个目录,并把crosstool-0.4.3放在crosstool目录下,解压。

:tar -zxvf crosstool-0.43.tar.gz(当然也可以在目标文件上点击右键解压,和windows一样)

三:配置文件

进入 /home/user/crosstool/crosstool-0.43 (你刚刚解压好的目录)

cp demo-arm.sh arm.sh(把demo-arm.sh 复制成 arm.sh)

1:修改arm.sh这个文件

将 TARBALLS_DIR = $HOME/download 改成 TARBALLS_DIR = /home/user/crosstool/download(放置下载文件的目录)

修改 RESULT_TOP=/home/user/crosstool/toolchain (放置你生成的目标文件)

将 #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.dat` sh all.sh --notest

arm.sh这个文件就修改好了,保存退出。

2:修改arm.dat

将里面的内容修改为:

KERNELCONFIG=`pwd`/arm.config

TARGET=arm-linux

TARGET_CFLAGS="-O"

3:修改 gcc-3.3.6-glibc-2.3.2.dat

将里面的内容修改为:

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.3.6

GLIBC_DIR=glibc-2.3.2

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2

LINUX_DIR=linux-2.6.10

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

这样就完成了所有的修改!

在当前目录的终端下输入 ./arm.sh命令

在使用crosstool构建工具链的过程中,出现了如下问题,导致arm-linux-gcc没有生成:

                                                     

> checking version of gcc... 4.0.0, bad

> checking for gnumake... no

> checking for gmake... gmake

> checking version of gmake... 3.80, ok

> configure: error:

> *** These critical programs are missing or too old: gcc

> *** Check the INSTALL file for required versions.

                                                

关于gcc的版本问题,直接执行./arm.sh,出现gcc版本过低的问题,而事实上mandriva上的gcc版本是4.3。问题的根源在于crosstool执行gcc编译的时候要进行版本匹配,过高的版本不支持。曾尝试重新安装低版本的gcc,却一直没有成功,后来发现可以直接更改crosstool的patch文件,就放弃了继续安装低版本的gcc。

修改crosstool-0.43/patches/glibc-2.3.2/下的glibc-2.3.3-allow-gcc-4.0-configure.patch文件,将"3.[2-9]*|4.[01]*"改为"3.[2-9]*|4.*"就OK了。然后删除glibc-2.3.3-allow-gcc-4.0-configure.patch~(保存文件)这点很重要啊,不删会出错的,因为他打的补丁是每一个文件,不识别保存文件!万事俱备了!

相关文章可查看:http://blog.chinaunix.net/u2/72383/showart_1076976.html

或者 直接下载一个低版本的gcc 在创建gcc到他的连接 也可以

四:测试

修改启动代码,让arm-linux-gcc成为像gcc一样的命令

vi /etc/profile

第一行上加上export这一行

export PATH = /home/user/crosstool/toolchain/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH

保存退出,source  /etc/profile  就OK了

然后随便进入一个目录创建hello.c

#include<stdio.h>

Int main(void)

{

Printf(“hello!world! \n “);

Return 0

}

保存退出

然后

arm-linux-gcc –o hello hello.c

这个文件执行不了然后用file hello能够查看,就说明成功了。

引自:http://www.open-src.org/bbs/viewthread.php?tid=1764

附:

crosstool编译过程中gcc版本问题

在使用crosstool构建工具链的过程中,出现了如下问题,导致arm-linux-gcc没有生成:
   
    > checking version of gcc... 4.0.0, bad
    > checking for gnumake... no
    > checking for gmake... gmake
    > checking version of gmake... 3.80, ok
    > configure: error:
    > *** These critical programs are missing or too old: gcc
    > *** Check the INSTALL file for required versions.

    察看crosstool目录中的contrib/inbox.txt文件,有关于这个问题的邮件描述:

> checking build system type... i686-pc-linux-gnu
> checking host system type... mipsel-unknown-linux-gnu
> checking sysdep dirs... sysdeps/mips/elf sysdeps/unix/sysv/linux/mips
> sysdeps/unix/sysv/linux sysdeps/gnu sysdeps/unix/common
> sysdeps/unix/mman sysdeps/unix/inet sysdeps/unix/sysv sysdeps/unix/mips
> sysdeps/unix sysdeps/posix sysdeps/mips/mipsel sysdeps/mips/fpu
> sysdeps/mips sysdeps/wordsize-32 sysdeps/ieee754/flt-32
> sysdeps/ieee754/dbl-64 sysdeps/ieee754 sysdeps/generic/elf sysdeps/generic
> checking for a BSD-compatible install... /usr/bin/install -c
> checking whether ln -s works... yes
> checking for pwd... /bin/pwd
> checking for mipsel-unknown-linux-gnu-gcc... gcc
> checking version of gcc... 4.0.0, bad
> checking for gnumake... no
> checking for gmake... gmake
> checking version of gmake... 3.80, ok
> configure: error:
> *** These critical programs are missing or too old: gcc
> *** Check the INSTALL file for required versions.
>
I have had the same problem. What I found was that the glibc configure
script was testing for a version of gcc 3.2.* or later. It does not test
for a major number above 3 so the test fails. I do not know where this
test is initiated, but once you have reached that point you can patch
the configure script and run demo-*.sh with the --nounpack option added
to your desired toolchain build.

This patch worked for me:

--- configure.orig      2005-09-19 21:31:45.000000000 -0400
+++ configure   2005-09-19 21:32:13.000000000 -0400
@@ -2274,6 +2274,8 @@
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
     3.[2-9]*)
        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+    4.*)
+       ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac

I hope that this helps. Good Luck.
-Mike Joyce

    其意思就是说,在glibc的configure脚本里会检查gcc的版本,当不是需要的版本就保错, glibc的configure中有如下检查:

if test -z "$CC"; then
  ac_verc_fail=yes
else
  # Found it, now check the version.
  echo "$as_me:$LINENO: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
  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]*)
       ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
    *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;

  esac
  echo "$as_me:$LINENO: result: $ac_prog_version" >&5
echo "${ECHO_T}$ac_prog_version" >&6
fi
if test $ac_verc_fail = yes; then
  critic_missing="$critic_missing gcc"
fi

    在上面的gcc版本检查中,只使用了模式3.[2-9]*即只支持3.xxx版本的gcc,在crosstool自己的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.*)就可以过去了。

    总之,在编译glibc的时候,其configure脚本对gcc的限定是比较严格的,而且并没有将后来的较新的版本考虑在内,这种严格的检查是我们在configure是出了错。但是如果我们直接修改glibc原码中的configure文件,又会造成crosstool在用他自己的patches给glibc的configure打补丁的时候出错,呵呵,还是去修改crosstool的补丁文件吧,glibc就留着不要动了。

  评论这张
 
阅读(1121)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018