Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1423382
  • 博文数量: 613
  • 博客积分: 11499
  • 博客等级: 上将
  • 技术积分: 5511
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 19:27
  • 认证徽章:
文章分类

全部博文(613)

文章存档

2016年(5)

2015年(18)

2014年(12)

2013年(16)

2012年(300)

2011年(45)

2010年(37)

2009年(79)

2008年(101)

分类: LINUX

2009-11-11 00:02:23

在ubuntu8.10 下建立 ARM-Linux 交叉编译环境

     很久都没有写文章了 ,经过了将近半年的奔波,终于可以写点东西了!在广州工作时 ,同事极力推荐我用ubuntu,使用之后的确很爽,并决定以后在ubuntu下工作,完全可以抛弃windows(晕到死)。决定开始 移植Linux到mini2440。首先就是在ubuntu下建立交叉编译工具链。借着在Fedora 下建立ARM-Linux的交叉编译工具的经验,按理说应该是不会有问题的,但是结果是比在Fedora下碰到的问题多得多了。以下先介绍成功编译的过程,碰到的问题和解决办法后面说。


这次编译过程中对我有重大帮助的资料有:

编译Mysqlconfigure: error: No curses/termcap library found 的错误解决方法》

[原创]ubuntu下动手编译arm-elf工具》

《在ubuntu下使用crosstool制作交叉编译工具》

ubuntu 8.04中编译ARM交叉平台的一点心得!》


 
 
关于crosstool的基本知识在我以前的《在 Fedora 下建立 ARMLinux 交叉编译环境》中已有介绍,这里我再多说,以下是具体过程:

 (1)保证你的ubuntu8.10下安装了以下软件开发工具。
 Bison
 flex
 build-essential
 patch
 libncurses5-dev
 我并没有试过没装这些工具的后果,都是网上的经验,你要是不信这个邪,就自己吃吃这个螃蟹。

 (2)因为ubuntu8.10自带的是gcc-4.3.2无法用crosstool正常编译交叉编译器,所以必须安装gcc-4.1,但是不必卸载4.3.2。方法是用新立得软件包管理器安装gcc-4.1,之后 参考chinazcw的方法

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的软连接)

 
 (3)如果你运行

ls -la /bin/sh

命令看到
/bin/sh其实是一个指向dash的软链接,则请运行以下命令,将/bin/sh链接到bash。

sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh



 (4)按照老方法修改crosstool的文件:demo-arm9tdmi.sh、gcc-4.1.1-glibc-2.3.2.dat,最后运行demo-arm9tdmi.sh。这些过程请参考我以前的文档《在 Fedora 下建立 ARMLinux 交叉编译环境》



     过程就这么简单,但是有些是用失败换来的。下面介绍下我的编译血泪史:
     一开始,我并不想用gcc-4.1而是想用自带的gcc-4.3.2,然后......................
 
   (1)编译到glibc的时候,在配置的时候会检测gcc的版本,configure 脚本认为gcc-4.3.2版本太老(其实是因为当时gcc还没有这么高的版本,只要不是3.2到4.1之间的版本,都认为too old),不能编译。
   这是可以解决的,方法就是修改glibc-2.3.2根目录下的configure 文件中的第1275行:

test -n "$CC" && break
done

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]*|4.[0-3]*)
       ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
    *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;

这样就可以骗过configure ,继续编译下去。

   但是修改的时机要把握好,要在 demo-arm9tdmi.sh解压完glibc-2.3.2后,运行其configure之前。我直接就将configure拷出来,修改后在crosstool解压完所有文件后直接覆盖源文件。

   其实这种方法我在fedora9下使用crosstool时就用过,但是当时发现f9真是做得比f8差,历史的倒退,所以就到回去用f8了,就没写文章总结。

 


  (2)编译gcc-3.3.6的时候,出现以下错误:

/usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments

    这纯属软件bug,因为使用open函数的时候,如果在第二个参数中使用了 O_CREAT,就必须添加第三个参数:创建文件时赋予的初始权限。而在gcc-3.3.6/gcc/的collect2.c文件中有漏掉第三个参数的错误,而gcc-4.3对语法错误的检查严格是出了名的(4.1就不会因此错误退出),所以就退出了。
    这也是可以解决的,就是在gcc-3.3.6/gcc/collect2.c中的第1575行改为:

redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0777);

    我还发现glibc-2.3.2/login/tst-grantpt.c也有一个类似错误,一起改过来,除后患。第44行:

fd = open (file, O_RDWR | O_CREAT, 0777);

   修改的时机也要把握好,我是在crosstool解压完所有文件后和之前configure 文件一起直接覆盖源文件。 



  (3)经历了以上的痛苦后,继续编译,会出现以下错误:

*** buffer overflow detected ***: arm-9tdmi-linux-gnu-ar terminated

fuck!!!!!!!!编译出来的 arm-9tdmi-linux-gnu-ar根本没法用!被耍了!放弃gcc-4.3.2!!!!!
   要是哪位仁兄解决了以上问题,并编译成功,一定要通知小弟啊!

  (4)安装了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



 (5)继续重新编译,在gcc做好后(此时gcc已可用,只是gdb还没编译好),编译gdb的时候出了以下错误:

configure: error: no termcap library found

很显然,是因为没装一个库文件造成的,google后发现正解:用新立得安装libncurses5-dev(或是apt-get install libncurses5-dev)即可。
   

   最后,编译成功,看到了盼望已久的“done”。

 

 

回目录 用crosstool0.43建立ARM-Linux 交叉编译环境

发表于: 2008-11-08,修改于: 2008-11-09 19:47,已浏览2898次,有评论0条 推荐 投诉


网友评论
网友: Amankwah 时间:2008-11-11 23:25:16 IP地址:119.32.62.★
嗯,我准备开始照你的做了。
不过在ubuntu下直接修改gcc的符号链接是不合适的,Ubuntu有一组命令,比如修改gcc的提供版本:
 sudo update-alternatives --config gcc
其他的类推,这才是在Ubuntu这种Debian系发行版下做这些事情合理的方法,呵呵。

Blog作者的回复:
谢谢刘兄指教!


网友: 本站网友 时间:2008-12-03 14:41:31 IP地址:61.48.106.★
请问出现了这个问题是怎么回事?
configure: error: C preprocessor "usr/local/arm/3.4.1/bin/arm-linux-gcc" fails sanity check 

网友: 本站网友 时间:2009-03-19 14:13:22 IP地址:59.41.170.★
你好,请问
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0
这些源码包中的“cgcc-3.3.6”是指gcc-core-3.3.6.tar.gz包吗?不是的话,那是指那种包?谢谢

Blog作者的回复:
没错,就是gcc-core-3.3.6.tar.gz


网友: 本站网友 时间:2009-07-01 16:32:29 IP地址:60.2.249.★
你好,我想问一下,我的OS是fedora4 GCC版本为4.0.0,而我编译交叉工具时用的GCC为4.1.0,这样OS的GCC版本低于要编译的GCC 4.1.0这样可以么。我就是安照你上面的解说做的,不过编译一个多小时以后,在[all-gcc]这出错了,在/home/*/bin下边生成了ar,ld等文件,但是没有GCC 和g++生成。是GCC的版本不对么??

Blog作者的回复:
我没用过这么老的系统,我也不清楚,可能有关,也可能是您少装了什么软件,没看出错信息我也不知道设什么原因。


网友: 本站网友 时间:2009-07-14 20:14:34 IP地址:218.7.43.★
你好,我在安装了一个交叉编译链之后有错误
提示说 “……/lib/tls/……glibc_2.4 not found……” 
在网上也没有搜索到好的解决办法
不知道您知道怎么解决吗?

网友: leibo3008 时间:2009-08-05 09:56:33 IP地址:123.7.54.★
博主,你好
我用你的方法在fedora9下进行编译,我用的组合和你一样,也是:
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0
在编译是出现gcc版本过高的错误,说是fc9下的gcc是4。3的,但是需要的是4。1的
我在网上找到一种方法说可以修改crosstool-0.43/patchs/glibc-2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.path这个文件,将“4.[01]*”改成“4.*”,但是改完还是同样的问题,不知道你遇到过这种情况吗?可能是什么原因,该怎么解决阿?谢谢博主了

网友: leibo3008 时间:2009-08-05 10:51:00 IP地址:123.7.54.★
接楼上
gcc版本过高的问题网上还有一种方法是删除高版本的gcc,不知这个可行不?

网友: iamxzg 时间:2009-09-19 19:19:13 IP地址:58.251.102.★
博主,你好
我用你的方法在fedora11下进行编译,我用的组合就内核不一样,如下:
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.29.4(就这里不一样,因为FC11内核为它,所以我想用它)
hdrs-2.6.12.0
然后在编译时出现错误:
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.
请问是gcc版本过高的原因吗,与内核没有关系吧?

Blog作者的回复:
你的host的gcc版本太高了,fedora建议用8,9及以上版本都会有这个问题。或者你用ubuntu:http://blog.chinaunix.net/u1/34474/showart.php?id=1388072

阅读(744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册