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

网上这类文章比较多,但是都不是很具体,刚好有门课结课论文要写这个,所以就总结了一下。以下的过程都是在ubuntu7.10上实际运行过的。

手工制作交叉编译工具

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

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

2制作步骤:

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

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

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

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

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

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

 

2工具的制作

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

第一步:

目录组织:linux下创建一个用户,然后在这个用户下创建一个目录crosstool,在这个目录下一次创建srckerneltoolchainpatch四个目录。将内核的压缩包放在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需要修正,所以在开始编译之前还要对一些文档进行修改,打一些补丁,否则会在后面的编译过程中出现很多错误,严重影响编译的速度。

修改及补丁

1glibc-2.3.6下的Makeconfig文件

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

/home/jyh/crosstool/toolchain/lib/gcc/arm-linux/3.4.6/http://www.cnblogs.com/http://www.cnblogs.com/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编译完成之后,下一步是完整编译gccglibc的正确编译已经为完整编译打下了好的基础,故一般不会出现什么问题。

第五步:

完全编译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++

支持的语言包括了cc++,当然也可以支持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

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

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

3制作方法介绍

该方法采用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具体制作方法

第一步:

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

第二步:

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

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=<proxy_host>:<port>

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

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

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

1)在主机上测试。

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

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

/Hello.c/

#include<stdio.h>

int main()

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

return 0;}

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

运行下列命令

$ 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对自动制作的交叉编译工具进行测试

运行下列命令:

$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 WongBuilding arm-linux toolchain for ARM/XSCALEhttp://blog.chinaunix.net/u/26710/showart_330554.html2007.6.8:全文

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

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

[6][电子文献] DanKegel网站2006.12.7http://kegel.com/crosstool/

[7][电子文献]Linux jounal http://www.linuxjournal.com/article/9904:GCC for Embdded Engineers

[8][电子文献] Cross ToolsChain-交叉编译工具2008.1.14http://www.diybl.com/course/6_system/linux/Linuxjs/200798/70533_4.html

 

 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ruben052013/archive/2008/07/16/2661476.aspx

你可能感兴趣的:(总结)