Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94520
  • 博文数量: 21
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-21 17:02
文章分类

全部博文(21)

文章存档

2011年(1)

2009年(20)

我的朋友

分类: LINUX

2009-05-26 17:28:30

  我使用的系统是Ubuntu 7.10(一个星期后应该就会成为8.04),具体:linux-2.6.22-14-generic,gcc-4.1.3,binutils-2.18,make-3.81
板子是武汉创维特公司的CVT-PXA270实验平台,该开发板用的是采用Intel Xscale内核技术的PXA270 (Bulverde),兼容ARM V5TE。
 
实际上我在上周已经建立起了一套交叉编译环境,当时用的是gcc-3.4.5,libc-2.3.6, 过程倒挺顺利,很快就弄好了,也能很好的跑程序,但是经过一番调查,这套工具有以下几个问题:
(1)软件包版本较老,心里老不太舒服;
(2)使用linux-threads而非新的NPTL(Native POSIX Threading Library)线程模型;
(3)所建立的toolchain遵循旧的ABI标准,而非新的ARM ABI标准;
(4)最重要的是,并没有实现真正意义上为PXA270芯片的iWMMX等新技术进行量身定制toolchain的目标。
今天抽空又做了套新的工具链,新的cross toolchain的特点在于:
(1)使用比较新的软件包(gcc-4.2.1/glibc-2.6.1);
(2)支持新的NPTL线程模型;
(3)所建立的toolchain遵循新的ARM ABI标准;
(4)针对PXA270处理器的特性(iWMMX技术),对toolchain进行了量身定制。
中间受挫折较多,现总结一下:
首先,系统中应该装好要用到的开发软件包,在 Ubuntu 中就是这几个:
build-essential,flex,bison,texinfo(这个小东西在第一次编译时害得我浪费了不少时间),基本就是这些吧。还要保证你的硬盘有至少2G的空闲空间。
现在正式开始:
1 准备源文件包
首先然后建立工作目录:
mkdir -p ~/crosstool/build/arm-iwmmxt-linux-gnueabi/gcc-4.2.1-glibc-2.6.1
sudo mkdir /opt/crosstool
sudo chown -Rv USERNAME /opt/crosstool
然后下载所需软件源文件:
①binutils-2.18.tar.bz2
②gcc-4.2.1.tar.bz2
③glibc-2.6.1.tar.bz2
④linux-headers-2.6.22.6.tar.bz2
⑤binutils-2.18-posix-1.patch
⑥gcc-4.2.1-cross_search_paths-1.patch
⑦gcc-4.2.1-posix-1.patch
⑧glibc-ports-2.6.1.tar.bz2
⑨glibc-2.6.1-libgcc_eh-1.patch
⑩glibc-2.6.1-localedef_segfault-1.patch
glibc-2.6.1-cross_hacks-1.patch
glibc-2.6.1-RTLD_SINGLE_THREAD_P-1.patch
把这些包下载下来,放到:~/crosstool/build/arm-iwmmxt-linux-gnueabi/gcc-4.2.1-glibc-2.6.1这个目录下面,解压并打好补丁,要注意这两个 :
-----------

cd glibc-2.6.1/
tar xvf ../glibc-ports-2.6.1.tar.bz2
mv ../glibc-ports-2.6.1 ports
patch -Np1 -i ../glibc-2.6.1-libgcc_eh-1.patch
patch …………

--------------------
cd linux-headers-2.6.22.6
install -dv ../linux-libc-headers-2.6.22.6/include
cp -av include/{asm-generic,asm-arm,linux,mtd,scsi,sound} ../linux-libc-headers-2.6.22.6/include/
patch …………


-----------------------------------------------
2 定制crosstool
还是采用crosstool-0.42,但是要用到支持新的ARM EABI的一个patch:下载地址:
把crosstool解压,打上这个补丁。

A. 建立自己的crosstool目录,并拷贝必要的文件。
---------------------------------------
mkdir ~/crosstool #build our own crosstool directory
cp -v demo-arm-iwmmxt.sh ~/crosstool
mkdir demo-script
mv demo* demo-script/ #we do not need other demo-*sh scripts
cp -av *.sh ~/crosstool #copy all.sh,crosstool.sh,… to our own directory
cp -av *.c ~/crosstool #copy fix-embedded-paths.c,… to our own directory
cp config.guess ~/crosstool #we need config.guess to get the value for $BUILD
----------------------------------------
其实crosstool可以自动为我们下载指定的软件包及相应版本的补丁,并自动解压缩和打补丁(通过getandpatch.sh脚本来实现)。由于本文不需要其他补丁和软件包,而且所需补丁的下载地址并不在getandpatch.sh的搜索范围内,所以这里采用手工下载软件包,解压并打补丁的方式,并修改crosstool的相关脚本以禁止调用getandpatch.sh :
-----------------
vim all.sh
找到下面这几行:
if test “$opt_no_unpack” = “”; then
if test “$opt_builduserland” = “1″; then
PTXDIST_DIR=ptxdist-testing-20031113
export PTXDIST_DIR
fi
# Download and patch
# if test -d “$BUILD_DIR”; then //
从这里开始注释掉7行代码
# Remove in background
# mv $BUILD_DIR $BUILD_DIR.del.$$
# rm -rf $BUILD_DIR.del.$$ &
# fi
# mkdir -p $BUILD_DIR
# sh getandpatch.sh
fi
另外,还要禁止自动进行目录清理:
if test “$opt_no_build” = “”; then
# Build
###################
从这里注释掉7行代码################
# if [ -d "$PREFIX" ]; then
# Remove in background for speed
# mv “$PREFIX” “$PREFIX.del.$$”
# rm -rf “$PREFIX.del.$$” &
# fi
# mkdir -p $PREFIX
# mkdir -p $BUILD_DIR
####################################################
cd $BUILD_DIR
----------------------------------------
说明:
由于arm-iwmmxt-eabi.sh中调用all.sh时没有传递–nobuild参数,因此上面被注释掉的语句会清除旧的$BUILD_DIR,建立一个新的干净的$BUILD_DIR,然后再调用crosstool.sh建立toolchain。另一方面,由于我们是要手工将源码包处理好放到SRC_DIR的,又因为没有给出SRC_DIR的值,all.sh认为SRC_DIR=$BUILD_DIR,这样实际上要求我们把源码包放到BUILD_DIR下,于是上面的语句恰好把SRC_DIR连同其中处理好的源码包一起删除了。所以要把上面的语句注释掉。
B. 修改crosstool.sh:
修正内核头文件的安装。
cp -r include/linux $HEADERDIR
cp -r include/asm-${ARCH} $HEADERDIR/asm
################
加上以下两行#########################
cp -r include/asm-generic $HEADERDIR/asm-generic
cd $BUILD_DIR
按照原来的脚本,会漏拷include/asm-generic目录,导致编译时找不到头文件而报错退出。
禁止修改GCC_HOST。
# if host is cygwin and this is not a canadian build, modify GCC_HOST
########################
从这里开始注释掉4行代码#####################
#case “$GCC_HOST,$CANADIAN_BUILD,” in
#*cygwin*,?*,) ;;
#*) GCC_HOST=`echo $GCC_HOST | sed s/-/-host_/` ;;
#esac
################################################################
本来有GCC_HOST=`./config.guess`=i686-pc-linux-gnu,上面的语句会将其更改为GCC_HOST=i686-host_pc-linux-gnu,导致在编译时找不到主机的CC而出错。
C. 编辑cpu.dat和gcc-glibc.dat文件。
用这两个核心文件来传递必要的参数:
vim cpu.dat ($PWD= ~/crosstool/)
内容如下:
---------------------------------------------
TARGET=arm-iwmmxt-linux-gnueabi
TARGET_CFLAGS=”-O2″ //
根据这里http://devpit.org/wiki/Gnu_Toolchain/Compatibility_Matrix的介绍,我把这个选项设置为O2,因为这也是花了很长时间、查阅了很多源代码和询问了google才得到的结果)
GCC_EXTRA_CONFIG=”–with-float=soft –with-cpu=iwmmxt –with-arch=iwmmxt –enable-cxx-flags=-msoft-float”
GLIBC_EXTRA_CONFIG=”–without-fp –disable-libunwind-exceptions”
GLIBC_EXTRA_CC_ARGS=”-finline-limit=10000″
USE_SYSROOT=1
-------------------------------------------

注意:
TARGET的名字并不是随意的,必须以arm开头而不能是pxa27x等其他字符串开头,因为crosstool会根据TARGET的名字来解析$ARCH的值。gcc的configure文件也要根据TARGET名字来进行裁决,如果要编译新的ARM EABI标准的toolchain,TARGET名字应该以arm*-*-linux-gnueabi形式出现。这里设置USE_SYSROOT是要按新的组织形式来安排目标系统根目录的库文件。
编辑gcc-glibc.dat如下:
vim gcc-glibc.dat
---------------------------
BINUTILS_DIR=binutils-2.18
GCC_DIR=gcc-4.2.1
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.22.6
GLIBC_DIR=glibc-2.6.1
GLIBCPORTS_FILENAME=glibc-ports-2.6.1
GLIBC_ADDON_OPTIONS=ports,nptl
---------------------------
D. 将demo-arm-iwmmxt.sh重命名为arm-iwmmxt-eabi.sh,并编辑如下:
----------------------------------
#!/bin/sh
set -ex
TARBALLS_DIR=$HOME/crosstool/downloads
RESULT_TOP=/opt/crosstool
GCC_LANGUAGES=”c,c++”
export GCC_LANGUAGES
PARALLELMFLAGS=-j3
export PARALLELMFLAGS
# 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
# Build the toolchain. Takes a couple hours and a couple gigabytes.
time eval `cat cpu.dat gcc-glibc.dat` sh all.sh –notest
echo Done.
------------------------------------
3 自动安装
在~/crosstool目录下执行:
./arm-iwmmxt-eabi.sh
计算机就开始自动编译安装toolchain,时间要比较长,你可以洗个澡或者睡个觉。在我的机器上(P4 2.8G,1G RAM)上花了大概80分钟吧(我整整看了3集老友记^^)不过看到测试程序跑起来的感觉很好!

自动安装完毕还应该将toolchain的路径添加到环境变量PATH中去,这样只需用可执行文件名便可调用toolchain,而不必使用绝对路径。
用vim编辑~/.bash_profile,加入下面一行:
PATH=/opt/crosstool/bin:$PATH
保存退出,执行”source ~/.bash_profile”,使刚才的修改生效(仅对当前终端有效,若要全局有效则需要注销或重启)。
===========
参考资料:
1.Building arm-linux toolchain for ARM/XScale-iWMMX

2.Gnu Toolchain/Compatibility Matrix

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