Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514862
  • 博文数量: 484
  • 博客积分: 10145
  • 博客等级: 上将
  • 技术积分: 5805
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 18:34
文章分类

全部博文(484)

文章存档

2011年(52)

2010年(107)

2009年(287)

2008年(38)

我的朋友

分类: LINUX

2010-05-20 00:14:31

制作交叉编译工具链的方法总结(详细)(转)

网上这类文章比较多,但是都不是很具体,刚好有门课结课论文要写这个,所以就总结了一下。以下的过程都是在 ubuntu7.10上实际运行过的。第一次在csdn上写文章。写的不好还请见谅。
手工制作交叉编译工具

在制作工具开始前先要选好所需要的Binutils、Gcc、glibc等组件的相匹配的版本。当然,它们的版本匹配选择较为复杂,这些组件的维护与发行 完全是各自独立的,不同的组件组合在一起时,并不能保证其正常工作,版本之间可能存在冲突或BUG。一般可以参考别人的经验,成功使用某种版本的组合制作 出了交叉编译工具,那么这样的组合应该是可以使用的。如果使用的包的组合是没人用过的,那么只能通过不断调试修改进行制作。一开始请使用每个套件最新出来 的稳定版本,如果无法建立的话,再一次换成旧的版本(引自[1])。

在制作选择各种组件的版本时参考了Aaron Wong的《Building arm-linux toolchain for ARM/XSCALE 》[2]这篇文章(在尝试了gcc-3.3.2失败之后选用的)除了这些组件,还需要linux的内核,内核的版本与以上这些组件的关系不大,主要是在编 译GLIBC时,需要内核头文件的支持,选用内核最好与目标机的系统的内核相一致,以免在目标机运行程序的时候产生冲突。

2.1 制作步骤:

准备工作:下载好所需要的软件包、准备好内核头文件、组织好目录。

编译binutils。这个软件包的编译相对简单,一般不会出现什么问题。

编译辅助gcc编译器。对gcc进行简单配置后,编译gcc,使其不依赖glibc,只对c语言支持,为后面的glibc的编译做准备。

编译glibc库。在这一步,首先将解压的内核头文件进行配置。在上一步的编译过程中,已经生成了arm-linux-gcc这个工具,利用这个工具去编 译glibc库。

编译完整的gcc(相对于第二步来说)。完整gcc的编译需要glibc库的支持,在第一步的时候glibc还没有被编译,所以只能简单配置,生成辅助的 gcc,而在这一步,glibc库已经编译了,可以使用了,所以,就可以对gcc进行完整的编译了。

编译gdb调试器。调试器与前面的那些软件包是相互独立的,所以放在最后编译。


2.2 工具的制作:

所以选择了配套的软件包是:Binutils-2.16、gcc-3.4.6、 glibc-2.3.6 、glibc-threads-2.3.6 、linux-2.6.11以及一些补丁。打补丁是为了解决编译过程中可能出现的错误。

第一步:

目录组织:在linux下创建一个用户,然后在这个用户下创建一个目录crosstool,在这个目录下一次创建src、kernel、 toolchain、patch四个目录。将内核的压缩包放在kernel目录下,将Binutils-2.16、 gcc-3.4.6、 glibc-2.3.6 、glibc-threads-2.3.6放在src目录下下,将下载的相应的补丁放在相应的目录下。

第二步:

编译binutils。现将binutils-2.16.tar.bz2拷到src目录下,运行命令:

jyh@jyh-laptop:~$ cd crosstool/src

jyh@jyh-laptop:~/crosstool/src$tar –jxf binutils-2.16.tar.bz2

jyh@jyh-laptop:~/crosstool/src$mkdir build-binutils

jyh@jyh-laptop:~/crosstool/src$cd build-binutils

jyh@jyh-laptop:~/crosstool/src/build-binutils$../binutils-2.16/configure\

> --target=arm-linux

> --prefix=/home/jyh/crosstool/toolchain

jyh@jyh-laptop:~/crosstool/src/build-binutils$make

jyh@jyh-laptop:~/crosstool/src/build-binutils$make install

这一步是对binutils进行编译,这一步相对简单,不会出现什么错误,要注意的是安装的路径。执行完以上的步骤在crosstool下的 toolchain下的bin找到可执行文件

jyh@jyh-laptop:~/crosstool/toolchain/bin$ ls

arm-linux-addr2line arm-linux-as arm-linux-ld arm-linux-objcopy arm-linux-ranlib arm-linux-size arm-linux-strip arm-linux-ar arm-linux-c++filt

arm-linux-nm arm-linux-objdump arm-linux-readelf arm-linux-strings

在完成了编译binutils之后进行gcc的第一次编译。但是需要注意的是把生成的这些文件的路径加入进去,在终端执行:export PATH=home/jyh/crosstool/toolchain/bin:${PATH},如若不然,在编译gcc的时候,会出现找不到arm- linux-ar命令的错误。

第三步:

编译gcc:

gcc的编译是需要glibc的支持的,而glibc又需要gcc进行编译,这仿佛是鸡与蛋的关系。解决的方法是先对gcc进行简单的配置然后编译,生成 一个只支持c的没有库支持的简单arm-linux-gcc,然后用这个生成的arm-linux-gcc去编译glibc,最后再进行gcc的完全编 译。这一步不能只是简单的进行配置、编译,因为没有库的支持,所以,在编译之前得告诉gcc,没有库的支持,这里就需要改变一些文件的内容来达到这个目 的。

现将gcc-3.4.6.tar.bz2这个包解压

jyh@jyh-laptop:~/crosstool/src$tar –jxf gcc-3.4.6.tar.bz2

创建一个编译的目录

jyh@jyh-laptop:~/crosstool/src$mkdir build-gcc

然后在gcc-3.4.6这个目录下,找到gcc这个目录,然后一次的目录是/config/arm

在这个目录下找到t-linux文件,打开这个文件并编辑

jyh@jyh-laptop:~/crosstool/src$cd gcc-3.4.6/gcc/config/arm

jyh@jyh-laptop:~/crosstool/src/gcc-3.4.6/gcc/config/arm$gedit t-linux

使用gedit打开这个配置文件

文件的原文如下:

# Just for these, we omit the frame pointer since it makes such a big

# difference. It is then pointless adding debugging.

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC

LIBGCC2_DEBUG_CFLAGS = -g0

LIB1ASMSRC = arm/lib1funcs.asm

LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx

# MULTILIB_OPTIONS = mhard-float/msoft-float

# MULTILIB_DIRNAMES = hard-float soft-float

# If you want to build both APCS variants as multilib options this is how

# to do it.

# MULTILIB_OPTIONS += mapcs-32/mapcs-26

# MULTILIB_DIRNAMES += apcs-32 apcs-26

# EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o

# LIBGCC = stmp-multilib

# INSTALL_LIBGCC = install-multilib

我们要做的只是修改两行

TARGET_LIBGCC2_CFLAGS = -Dinhibit_libc -D__gthr_posix_h -fomit-frame-pointer –fPIC(修改)

T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h(添加)(引自[3])

-Dinhibit_libc -D__gthr_posix_h的意思是禁止使用libc,现在还没用glibc,这样在编译的时候就可以不需要glibc而直接进行编译了。改完这个 文件之后,还是不够的。改完这个文件之后,gcc就可以正常的编译安装了,但是,这样会在后面的编译glibc的过程中出现错误。为了避免,那么我们就先 要需要的补丁打上,这个补丁是flow.c.diff(引自[2])/

jyh@jyh-laptop:~/crosstool/src$ patch -d gcc-3.4.6 -p1 < flow.c.diff

jyh@jyh-laptop:~/crosstool/src$export PATH=/home/jyh/crosstoll/toolchain/bin:${PATH}

jyh@jyh-laptop:~/crosstool/src$cd build-gcc

jyh@jyh-laptop:~/crosstool/src/build-gcc$../gcc-3.4.6/configure\

> --target=arm-linux \

>--prefix=/home/jyh/crosstool/toolchain \

> --without-headers \

> --disable-shared \

> --disable-threads \

> --enable-languages=c

--target=arm-linux 指定交叉编译工具的目标系统是arm-linux(也可以加上其他的标识,例如arm-xscale-linux)

--without-headers 不需要内核的头文件

--prefix=/home/jyh/crosstool/toolchain 指定安装的路径

--disable-shared 不使用共享库

--disable-threads 不使用线程

--enable-languages=c 表示仅支持c语言

jyh@jyh-laptop:~/crosstool/src/build-gcc$make

jyh@jyh-laptop:~/crosstool/src/build-gcc$make install

编译完成之后,会在 /home/jyh/crosstool/toolchain/bin下生成下面的一些可执行文件

jyh@jyh-laptop:~/crosstool/toolchain/bin$ ls

arm-linux-addr2line arm-linux-c++filt arm-linux-gcc-3.4.6 arm-linux-ld arm-linux-objdump arm-linux-size arm-linux-ar arm-linux-cpp arm-linux-gccbug arm-linux-nm arm-linux-ranlib arm-linux-strings arm-linux-as arm-linux-gcc arm-linux-gcov arm-linux-objcopy arm-linux-readelf arm-linux-strip

下一步我们要编译glibc,这将是一个关键的一步,一方面,其编译过程复杂而且时间长,另一方面完整的gcc编译也是依赖glibc的。

第四步:

编译glibc:首先,配置内核头文件[2]。首先先把在内核解压后的目录下执行

make ARCH=arm menuconfig

jyh@jyh-laptop:~$ cd crosstool/kernel/linux-2.6.11.1

jyh@jyh-laptop:~crosstool/kernel/linux-2.6.11.1$make ARCH=arm menuconfig

执行后会出现一个界面,让我们选择配置

然后依次选择System Type ARM system type PXA2xx-based项

回到第二个界面,选择--- Processor Type项

选择目标板类型,根据具体的情况而定。

选择完成后保存刚才对内核的这些配置。

在终端输入:make /include/linux/version.h

这一步很重要,如果没做,那么会在下面配置glibc的时候提示你内核版本太旧。配置完内核,将这些头文件拷到我们指定的目录下,这个目录是我们在编译 glibc的时候指定的头文件目录。

jyh@jyh-laptop:~/crosstool/kernel/linux-2.6.11.1$

cp -ainclude/linux /home/jyh/crosstool/toolchain/arm-linux/include

jyh@jyh-laptop:~/crosstool/kernel/linux-2.6.11.1$

cp -a include/asm-arm /home/jyh/crosstool/toolchain/arm-linux/asm

jyh@jyh-laptop:~/crosstool/kernel/linux-2.6.11.1$

cp -a include/asm-generic /home/jyh/crosstool/toolchain/arm-inux

配置完内核之后,就可以开始编译glibc了。但是glibc中有很多BUG需要修正,所以在开始编译之前还要对一些文档进行修改,打一些补丁,否则会在 后面的编译过程中出现很多错误,严重影响编译的速度。

修改及补丁

1.glibc-2.3.6下的Makeconfig文件

打开该文件,然后查找-lgcc_eh 这几个字符,找到之后,删除所有。否则再编译过程中会出现下面的错误。

/home/jyh/crosstool/toolchain/lib/gcc/arm-linux/3.4.6/../../../../arm- linux/bin/ld:找不到 -lgcc_eh

collect2: ld returned 1 exit status

make[2]: *** [/home/jyh/crosstool/src/build-glibc/iconv/iconvconfig] 错误 1

make[2]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6/iconv'

make[1]: *** [iconv/others] 错误 2

make[1]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6'

make: *** [all] 错误 2

2.在glibc-2.3.6下的sysdeps/unix/sysv/linux/arm/ioperm.c

找到所有的BUS_ISA 改为 CTL_BUS_ISA

否则会出现下面的错误

./sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':

../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)

../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once

../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)

../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant

../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')

../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant

../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')

make[2]: *** [/home/jyh/crosstool/src/build-glibc/misc/ioperm.o] 错误 1

make[2]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6/misc'

make[1]: *** [misc/subdir_lib] 错误 2

make[1]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6'

make: *** [all] 错误 2

修改此处已经有补丁可以做到了,可以再crosstool-0.43中找到这个补丁,名称为:arm-ctl_bus_isa.patch,还有一个功能 一样的补丁ioperm.c.diff

可以在终端执行下面的命令打上补丁:

jyh@jyh-laptop:~/crosstool/src$ patch -d glibc-2.3.6 -p1 < arm-ctl_bus_isa.patch

3.在glibc-2.3.6 /sysdeps/arm的目录下,修改dl-machine.h这个文件。在这个文件中找到

static Elf32_Addr, 将其改为auto inline Elf32_Addr

否则会出现下面的问题:

../sysdeps/generic/uname.c:25:25: config-name.h: No such file or directory

../sysdeps/generic/uname.c: In function `__uname':

../sysdeps/generic/uname.c:57: error: `UNAME_SYSNAME' undeclared (first use in this function)

../sysdeps/generic/uname.c:57: error: (Each undeclared identifier is reported only once

../sysdeps/generic/uname.c:57: error: for each function it appears in.)

../sysdeps/generic/uname.c:58: error: `UNAME_RELEASE' undeclared (first use in this function)

../sysdeps/generic/uname.c:59: error: `UNAME_VERSION' undeclared (first use in this function)

../sysdeps/generic/uname.c:60: error: `UNAME_MACHINE' undeclared (first use in this function)

make[2]: *** [/home/jyh/crosstool/src/build-glibc/posix/uname.o] 错误 1

make[2]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6/posix'

make[1]: *** [posix/subdir_lib] 错误 2

make[1]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6'

make: *** [all] 错误 2

4.在build-glibc/csu目录下,找到version-info.h这个文件

文件原文如下:

"Compiled on a Linux 2.6.11.1 system on 2008-05-23.\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"

否则在编译的过程中会提示你缺少终止符,在第二第三行

/home/jyh/crosstool/src/build-glibc/csu/version-info.h:2: error: missing terminating " character

/home/jyh/crosstool/src/build-glibc/csu/version-info.h:3: error: missing terminating " character

version.c:40: error: syntax error before string constant

make[2]: *** [/home/jyh/crosstool/src/build-glibc/csu/version.o] 错误 1

make[2]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6/csu'

make[1]: *** [csu/subdir_lib] 错误 2

make[1]: Leaving directory `/home/jyh/crosstool/src/glibc-2.3.6'

make: *** [all] 错误 2

对于这个错误可直接将源文件改为

"Compiled on a Linux 2.6.11.1 system on 2008-05-23.\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"

修改完这些地方,开始进行编译:

jyh@jyh-laptop:~/crosstool/src/build-glibc$

CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld

../glibc-2.3.6/configure \

>--host=arm-linux \

>--prefix="/usr" \

> --with-headers=/home/jyh/crosstool/toolchain/arm-linux/include \

>--enable-add-ons=linuxthreads \

>--enable-shared

--host 指定目标板的体系结构

--with-headers 指定内核头文件的路径,该路径与我上面所提到的路径是一样的。

--enable-add-ons=linuxthreads 支持线程库

--enable-shared 支持共享库

CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld 这些是在编译glibc时要用到的交叉工具链 arm-linux-gcc是我们在上一步中制作的,其他两个在第一步中就生成了。

jyh@jyh-laptop:~/crosstool/src/build-glibc$make

这一步是很漫长的一步,根据计算机硬件的性能不同,编译的时间也不同,大约半个小时

执行完之后:

jyh@jyh-laptop:~/crosstool/src/build-glibc$

make install_root=/home/jyh/crosstool/toolchain/arm-linux prefix=”” install

这里修正了glibc的安装路径,将glibc库安装到home/jyh/crosstool/toolchain/arm-linux/lib这个目录 下,之后我们还要修改一个文件。因为刚才我们修改了文件安装的目录,而make install这个命令是默认将库安装在了根文件系统上。这样,连接c语言和库文件就会出现问题,所以得修改库的连接路径。

修改5:

在home/jyh/crosstool/toolchain/arm-linux/lib目录下找到libc.so

文件的最后一行

原文

GROUP (/libc/libc.so.6 /lib/libc_nonshared.a)

改为

GROUP (libc.so.6 libc_nonshared.a)

Glibc编译完成之后,下一步是完整编译gcc,glibc的正确编译已经为完整编译打下了好的基础,故一般不会出现什么问题。

第五步:

完全编译gcc:在进行编译之前,首先将我们在第三步中修改的部分去掉,因为第三步中我们没有库可以给gcc使用,而现在,我们已经编译了glibc了, 那么在完整编译gcc的时候,就可以得到库的支持了。

修改完之后,就可以进行编译了

jyh@jyh-laptop:~/crosstool/src/build-gcc$

../gcc-3.4.6/configure \

> --target=arm-linux \

>--prefix=/home/jyh/crosstool/toolchain \

>--enable-languages=c,c++

支持的语言包括了c和c++,当然也可以支持java等其他的语言,但需做相应修改。 jyh@jyh-laptop:~/crosstool/src/build-gcc$make

需要大约十五分钟左右

jyh@jyh-laptop:~/crosstool/src/build-gcc$make install

这样,交叉编译工具就基本制作完了。

下面制作调试工具gdb

第六步:

制作交叉调试器:

交叉调试器不是工具链的必须的工具,但是它是与工具链配套使用的,gdb的调试能力和BUG 修正也因为版本的不同而不同,建议尽量使用最新的版本,这样可以减少后面编译过程中可能出现BUG。本文选择了gdb-6.5。尝试了gdb-5.3,但 是在编译过程中出错了。

jyh@jyh-laptop:~/crosstool/src$tar –jxf gdb-6.5.tar.bz2

jyh@jyh-laptop:~/crosstool/src$mkdir build-gdb

jyh@jyh-laptop:~/crosstool/src$cd build-gdb

jyh@jyh-laptop:~/crosstool/src/build-gdb$../gdb-6.5/configure \

> --target=arm-linux \

> --prefix=/home/jyh/crosstool/toolchain

指定了目标板体系结构和安装路径即可

编译

jyh@jyh-laptop:~/crosstool/src/build-gdb$make

jyh@jyh-laptop:~/crosstool/src/build-gdb$make install

然后编译gdbserver

目标板还需要gdbserver工具为目标板交叉编译gdbserver

jyh@jyh-laptop:~/crosstool/src/gdb-6.5/gdb/gdbserver$ chmod 777 configure

jyh@jyh-laptop:~/crosstool/src/gdb-6.5/gdb/gdbserver$

export PATH=/home/jyh/crosstool/toolchain/bin:${PATH}

jyh@jyh-laptop:~/crosstool/src/gdb-6.5/gdb/gdbserver$

CC=arm-linux-gcc ./configure --host=arm-linux

编译的结果是生成了gdbserver和gdbreplay,这是目标板体系结构的可执行程序,复制到目标机系统中即可使用。(引自[3])

3.自动制作交叉编译工具

3.1 制作方法介绍

该方法采用crosstool-0.43脚本生成适用于xscale平台的交叉编译工具。

Crosstool介绍:

crosstool是由Dan Kegel维护的制作适用于不同架构平台(包括PowerPC,MIPS,ARM,X86等等)的交叉编译工具链的一组脚本,用crosstool生成交 叉编译工具避免了手动过程遇到的一系列问题,大大节省了时间。DanKegel为此建立了社区,接受使用者反馈回来的关于软件工具组合在那个平台上成功了 等一系列有效信息,以修改和维护脚本。用crosstool生成交叉编译工具遇到的问题相比手动编译出的问题少,唯一的挑战来自修改bash shell文件的灵活性,需要有一定的shell脚本知识。

Crosstool-0.43解压后有以下几个目录:

buildlogs目录:介绍各种版本软件包匹配后在具体平台上运行的日志。

contrib目录:为社区贡献的补丁。

Doc目录:开发使用文档。

Patch目录:各种版本工具需要的补丁。

Sumarry目录:各种体系结构测试的总结。





3.2 具体制作方法

第一步:

下载crosstool-0.43.tar.gz包并解压,假定这里的解压目录是/home/ruben

第二步:

进入解压后的文件夹,找到适合xscale平台的脚本demo-arm-xscale.sh,打开后可以选择相应的gcc和glibc,只需要将相应版本 的语句前面的#号去掉就可以了,我选择的是这一行:

eval `cat arm-xscale.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest

第三步:

找到gcc-4.1.0-glibc-2.3.2.dat文件,打开查看其它所需文件的版本:(如下)

BINUTILS_DIR=binutils-2.16.1

GCC_CORE_DIR=gcc-3.3.6(这里需要下载gcc-3.3.6而不是gcc-core-3.3.6)

GCC_DIR=gcc-4.1.0

GLIBC_DIR=glibc-2.3.2

LINUX_DIR=linux-2.6.15.4

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2

GDB_DIR=gdb-6.5

GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18" //向下兼容到Linux2.4.18

第四步:

all.sh脚本会自动下载相应的包,并解压打补丁,由于采用wget这种单线程下载,而且是国际网,速度很慢。最好选择在windows下载好了,放到 指定的目录下,这里是/home/ruben/downloads(网上介绍大部分是要自己解压打补丁),因为补丁较多,而且修改脚本难度较大,在制作过 程中最好采用第五步的第三种方法,即下载后不做修改,直接放到下载的目录下。

第五步:

修改脚本的几种方法:

1.注释掉all.sh调用getandpatch.sh部分,自己手动下载,并打补丁。如下所示:

# Download and patch

##############################################################################

# if test -d "$BUILD_DIR"; then //whether downloads log exists

# Remove in background //if exists,remove

# mv $BUILD_DIR $BUILD_DIR.del.$$

# rm -rf $BUILD_DIR.del.$$ &

# fi

#mkdir -p $BUILD_DIR //if not ,mkdir

# sh getandpatch.sh // run getandpatch.sh

##############################################################################

2、还可以修改getandpatch.sh有关下载的部分,解压和打补丁的工作还是让脚本去做。注释掉的部分如下:

##############################################################################

# Download the given file to $TARBALLS_DIR

downloadFile()

{

echo downloadFile $1

# Hacky little kludge. Useful during buildsrpms.sh to avoid redownloading over and over.

if test -n $TARBALLS_CACHE_DIR && test -f $TARBALLS_CACHE_DIR/`basename $1`; then

cp $TARBALLS_CACHE_DIR/`basename $1` $TARBALLS_DIR

return

fi

# If downloads are disabled, just fail

test -z "$NO_DOWNLOAD" || return 1

case $1 in

*glibc-200*gz)

wget --tries=5 -P ${TARBALLS_DIR} -c $1 || wget --tries=5 --passive-ftp -P ${TARBALLS_DIR} -c $1 || \

(cd $TARBALLS_DIR; sh $TOP_DIR/glibc-get.sh $1; )

;;

*)

# Note: if you need to use a proxy, try

# export http_proxy=:

wget --tries=5 -P ${TARBALLS_DIR} -c $1 || wget --tries=5 --passive-ftp ${TARBALLS_DIR} -c $1

# FIXME: support curl on systems that don't have wget

;;

esac

}

##############################################################################

# Download, unpack, and patch a tarball from any one of the given URLs.

# If the directory already exists, don't download and unpack it.

# If the tarball already exists, don't download it.

# Assumes that the tarball unpacks to a name guessable from its url,

# and that patches already exist locally in a directory named after the tarball.

getUnpackAndPatch() {

set -x

# Check to see if the tarball already exists

//whether the packets exists

exists=""




3、什么都不用修改,建立downloads目录,将下载的软件工具放在downloads目录下,如果不确定download目录在那个目录下,可以先 运行一下脚本,看看这个目录在哪儿产生。

第六步:

运行demo-xscale-arm.sh,键入命令./ demo-xscale-arm.sh或sh demo-xscale-arm.sh,脚本开始自动编译。如果遇到严重错误会停止。警告之类则不会停止。经过数个小时的编译,会在/opt目录下生成名 为crosstool的交叉编译工具。

第七步:

将路径添加到./bashrc文件中。

$echo “export PATH=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-xscale-linux-gnu/bin:{PATH}”>>~/.bashrc

$source ~/.bashrc

$arm-xscale-linux-gnu-gcc -v

结果如下:

Using built-in specs.

Target: arm-xscale-linux-gnu

Configured with: /home/ruben/crosstool-0.43/build/arm-xscale-linux-gnu/gcc-4.1.0-glibc-2.3.2/gcc-4.1.0/configure --target=arm-xscale-linux-gnu --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-xscale-linux-gnu --with-cpu=xscale --enable-cxx-flags=-mcpu=xscale --with-headers=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-xscale-linux-gnu/arm-xscale-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-xscale-linux-gnu/arm-xscale-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long

Thread model: posix

gcc version 4.1.0

处理编译过程中遇到的问题

(1)编译过程会遇到比较严重的问题,是glibc中有关换行的错误。

修改方法如下:
在/glibc2.3.2/csu目录下找到Makefile,打开找到下面几行:

if test -n "$$files"; then \

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

sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \

-e 's/\(^.*$$\)/\"\1\\n\"/' $$files; \

修改为:

if test -n "$$files"; then \

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

sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \

-e 's/\(^.*$$\)/\"\1\\\\n\"/' $$files; \

如果解压的过程是让脚本做的,那么必须将修改后的glibc压缩,并覆盖掉的原来的压缩包,每一次遇到错误都要从新开始,这个是crosstool- 0.43的缺陷。

(2)解决每次遇到错误就要从新开始的问题,唯一的方法的是修改脚本,尽量注释掉每一次已做过的内容。这个要求对脚本的编写及调用关系相当清楚。

4 测试所制作的交叉编译工具

测试交叉编译工具,有以下两种方法:

(1)在主机上测试。

(2)在烧写好的嵌入式开发环境的minicom 下运行可执行程序。

首先编写简单的的hello.c文件

/Hello.c/

#include

int main()

{printf("this is a c!!");

return 0;}

4.1 对手工制作的交叉编译工具进行测试

运行下列命令

$ arm-linux-gcc -o hello hello.c

$ file hello

显示如下:

hello: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped

4.2 对自动制作的交叉编译工具进行测试

运行下列命令:

$arm-xscale-linux-gnu-gcc -o hello hello.c

$file hello

显示如下:

hello: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.18, dynamically linked (uses shared libs), not stripped

说明:可执行代码均在sitsang平台上运行成功,由于以上两种方法均是基于Linux2.6内核,因此不能在RedHat9.0下使用。必须在主机 Linux2.6内核的基础上使用。




参考文献:

[1][译著]Karim Yagbmour著.《构建嵌入式LINUX系统》.O’Reilly Taiwan公司 译.北京:中国电力出版社.2004.12:第四章GNU Cross-Platform Development Toolchain

[2]《嵌入式Linux系统开发技术详解:基于ARM》孙纪坤, 张小全编著.人民邮电出版社.2006:

建立交叉编译环境部分

[3][电子文献]Aaron Wong《Building arm-linux toolchain for ARM/XSCALE 》http://blog.chinaunix.net/u/26710/showart_330554.html2007.6.8:全 文

[4][译著] Molay,B著.《Unix/Linux编程实践教程》.杨宗源,黄海涛译.北京:清华大学出版社. 2004.10 :第8、9章228-296

[5][译著] hallinan,C著.《嵌入式Linux开发》:英文.北京:人民邮电出版社.2008.2 :303-350

[6][电子文献] DanKegel网站2006.12.7

[7][电子文献]Linux jounal for Embdded Engineers

[8][电子文献] Cross ToolsChain-交叉编译工具2008.1.14
阅读(587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~