Chinaunix首页 | 论坛 | 博客
  • 博客访问: 425794
  • 博文数量: 32
  • 博客积分: 1843
  • 博客等级: 上尉
  • 技术积分: 634
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-25 14:30
个人简介

Nothing is impossible

文章分类

全部博文(32)

文章存档

2013年(4)

2012年(13)

2011年(6)

2008年(9)

分类: LINUX

2008-08-27 00:36:16

交叉工具的制作,之前已经有介绍过一篇
交叉编译环境,内核映像和文件系统生成

下面介绍另一种方法,用crosstool制作交叉工具

主机环境:
Kubuntu 8.04
gcc-4.2.3
--------------------------------------------------------------
crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。

这次制作参考了:《 在Fedora 下建立 ARM-Linux 交叉编译环境
在《在Fedora 下建立 ARM-Linux 交叉编译环境 》中,已经对整个crosstool的过程做了详细的描述,所以这里不再累赘,只是记录碰到的相关问题的解决方法

采用demo-arm.sh编译。由于我用的ubuntu,所以还是碰到了问题

首先要对crosstool-0.43目录下的几个文件进行修改:
demo-arm.sh
arm.dat
gcc-4.1.0-glibc-2.3.2-tls.dat


其中,
$gedit arm.dat
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux-gnu  //这里原来是arm-unknown-linux-gnu,红色部分都不要写在该文件里
TARGET_CFLAGS="-O"


问题1:
错误信息
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.


思路:
  我以为是gcc版本(gcc-4.1)过于陈旧造成,于是乎,我很自以为然地将gcc版本提高到gcc-4.3

步骤:
a. 修改demo-arm.sh
$gedit demo-arm.sh
...
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
eval `cat arm.dat gcc-4.3.0-glibc-2.3.6-tls.dat` sh all.sh --notest


b. 增加gcc-4.3.0-glibc-2.3.6-tls.dat
$cp gcc-4.1.1-glibc-2.3.6-tls.dat gcc-4.3.0-glibc-2.3.6-tls.dat

c. 更换gcc版本
$gedit gcc-4.3.0-glibc-2.3.6-tls.dat
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.3.0
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.26
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"


然后再运行$./demo-arm.sh

问题2:
错误信息
In file included from version.c:33:
/opt/software/crosstool-0.43/build/arm-linux-gnu/gcc-4.3.0-glibc-2.3.6/build-glibc/csu/version-info.h:2:1: missing terminating " character
/opt/software/crosstool-0.43/build/arm-linux-gnu/gcc-4.3.0-glibc-2.3.6/build-glibc/csu/version-info.h:3:1: missing terminating " character
make[2]: *** [/opt/software/crosstool-0.43/build/arm-linux-gnu/gcc-4.3.0-glibc-2.3.6/build-glibc/csu/version.o] 错


version-info.h内容
"Compiled on a Linux 2.6.12 system on 2008-08-25.\n"
"Available extensions:         
"
"    GNU libio by Per Bothner\n"
"    crypt add-on version 2.1 by Michael Glad and others\n"
"    linuxthreads-0.10 by Xavier Leroy\n"
"    BIND-8.2.3-T5B\n"
"    libthread_db work sponsored by Alpha Processor Inc\n"
"    NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"


参考

在ubuntu下使用crosstool制作交叉编译工具
知道,这个问题的原因应该是由ubuntu系统本身引起

In Ubuntu 6.10, the default system shell, /bin/sh, was changed to dash (the Debian Almquist Shell); previously it had been bash (the GNU Bourne-Again Shell). The same change will affect users of Ubuntu 6.06 LTS upgrading directly to Ubuntu 8.04 LTS. This document explains this change and what you should do if you encounter problems.

The default login shell remains bash.


不过,我查看了一下我的shell($echo $SHELL),发现是bash,那就应该不是shell的原因了吧

再参考

找到了解决办法

步骤:
a. 进入crosstool的源目录(从demo-arm.sh知道),找到glibc-2.3.6.tar.bz2解压
$tar jxvf glibc-2.3.6.tar.bz2

b. 修改csu/目录下的Makefile
$gedit glibc-2.3.6/csu/Makefile
找到最后一个echo并修改并保存

echo "\"Available extensions:\\n\"";            \

修改成

echo "\"Available extensions:\\\\n\"";            \



c. 重新生成glibc-2.3.6.tar.bz2
$tar jcf glibc-2.3.6.tar.bz2 glibc-2.3.6/
这之前,我先备份了glibc-2.3.6.tar.bz2,以免错误发生

d. 重新运行$./demo-arm.sh

问题3:
错误信息
crosstool: glibc refuses to build if LD_LIBRARY_PATH is set. Please unset it before running this script.


这个问题好解决,unset一下就行了
$ unset LD_LIBRARY_PATH

问题4:
../sysdeps/generic/s_fmax.c: In function `__fmax':
../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3328
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
make[2]: *** [/opt/software/crosstool-0.43/build/arm-linux-gnu/gcc-4.3.0-glibc-2.3.6/build-glibc/math/s_fmax.os] 错


参考
《 》
再对比
《 》
的信息,我很无奈地发现,MS我所编译的gcc-4.3目前还不被支持,一下仿佛又被打回原形,只好再退回到gcc-4.1编译

重复问题1:
错误信息
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.


为什么会提示gcc太陈旧呢,可是我用Fedora8编译的时候,并没有出现这个问题
再次参考

在其随后的评论中找到了解决办法,因为本机gcc版本太高!!!我马上查了一下Fedora8中的gcc版本,是4.1.3,而KUbuntu 8.04下是4.2.3

步骤:
a. 卸载gcc-4.2.3
$sudo apt-get remove gcc

b. 安装gcc-4.1
$sudo apt-get install gcc-4.1

c. 再次运行$./demo-arm.sh

其后可能还会碰到问题2(因为换成glibc-2.3.2了),解决的时候可能是后面的两个echo都要改。此后,就OK了

如果要编译内核时,因为之前卸载了gcc-4.2,可能随之卸载的有g++、build-essential等,需要重新再安装
安装build-essential的时候,又要求要装回gcc-4.2,无奈只好同意。还好的是,对于已经完成的交叉编译不再有影响



阅读(4429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~