建立交叉编译器

发布时间 : 星期一 文章建立交叉编译器更新完毕开始阅读

? libiberty 包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。

? libbfd 二进制文件描述库。

? libopcode 用来处理opcodes的库,在生成一些应用程序的时候也会用到它。

Binutils工具安装依赖于Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具

下面将分步介绍安装binutils-2.19.2的过程 [root@localhost script] # cd $PRJROOT/src-dir

[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.tar.bz2 [root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils 创建Makefile:

[root@localhost src-dir] # ../../src-dir/binutils-2.19/config --target=$TARGET --prefix=$PREFIX 在build-binutils目录下面生成Makefile文件,然后执行make,make install。完成后可以在$PREFIX/bin下面看到我们的新的binutil。

注意:每个工具的文件名的前缀都是前面为TARGET变量设定的值。如果目标板arm-linux,那么这些工具的文件名前缀就会是arm-linux-。这样就可以根据目标板类型找到正确的工具程序。

五、建立内核头文件

在这里我们使用时2.6.29的内核版本,因为交叉工具链工具链是针对特定的处理器和操作系统的,因此在编译之前就需要对linux内核进行配制,可以通过make config或make menuconfig命令对内核进行配制,配制完成后,在linux源文件的目录下就会生成一个.config文件,这就是我们所需要的文件。 Note: 目标板的内核版本是2.6.29

[root@localhost embedded- toolchains] #cd kernel

[root@localhost kernel] #tar jxvf ../setup-dir/linux-2.6.29.tar.bz2 [root@localhost kernel] #bunzip2 ../setup-dir/patch-2.6.29.bz2 [root@localhost kernel] #cd linux-2.6.29 给Linux内核打补丁:

[root@localhost linux-2.6.29] #patch -p1 < ../../setup-dir/patch-2.6.29 然后就是配置内核,第一步是修改Makefile 修改 Makefile:

ARCH = arm CROSS_COMPILE = arm-linux- menuconfig 接着使用make menuconfig进入内核配置菜单 或者直接写:

# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

注意:在配置时一定要选择处理器的类型,比如我的目标机使用的处理器是OMAP类型的,就选TI OMAP: System Type -à

ARM System Type -à (x) TI OMAP 配置完退出并保存。

配置完须执行make,参数如下:

[root@localhost linux-2.6.29]# make ARCH=arm CROSS_COMPILE=arm-linux- (执行过程中有错误出现也没关系,主要目的是产生头文件version.h和autoconf.h)

执行完检查一下内核目录中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,这是编译glibc要用到的。version.h 和 autoconf.h 文件的存在,说明你生成了正确的头文件。

接下来建立工具链需要的include目录,并将内核头文件复制过去。 [root@localhost linux-2.6.29] #cd include [root@localhost include] #ln -s asm-arm asm

可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。(2.6.29已自动生成)

[root@localhost include] #cd asm

[root@localhost asm] #ln -s arch-epxa arch [root@localhost asm] #ln -s proc-armv proc

可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。 复制头文件到交叉编译工具链的安装目录:

[root@localhost asm] #mkdir -p $TARGET_PREFIX/include

[root@localhost asm] #cp -r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/ include

[root@localhost asm] #cp -r $PRJROOT/kernel/linux-2.6.29/include/asm-arm $TARGET_PREFIX/

Include/asm

[root@localhost asm]#cp -r $PRJROOT/kernel/linux-2.6.29/include/asm-generic $TARGET_PREFIX/include

[root@localhost asm]#cp -r $PRJROOT/kernel/linux-2.6.29/arch/arm/include/asm $TARGET_PREFIX/include

[root@localhost asm]#cp -r $PRJROOT/kernel/linux-2.6.29/arch/arm/mach-at91/include/mach $TARGET_PREFIX/include/asm

Note: mach-xxx是根据目标板所用的cpu类型来选择的 六、建立初始编译器 (boot strap gcc)

这一步的目的主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。安装过程如下:

[root@localhost build-binutils] #cd $PRJROOT/setup-dir 重命名:

[root@localhost setup-dir] #mv gcc-core-4.4.4.tar.bz2 gcc-4.4.4.tar.bz2 [root@localhost setup-dir] #cd $PRJROOT/src-dir

[root@localhost src-dir] #tar jxvf ../setup-dir/gcc-4.4.4.tar.bz2

从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为\和\,那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。 [root@localhost src-dir]# tar jxvf ../setup-dir/mpfr-2.4.0.tar.bz2 [root@localhost src-dir]# tar jxvf ../setup-dir/gmp-4.2.tar.bz2 [root@localhost src-dir]# mv mpfr-2.4.0 gcc-4.4.4/mpfr [root@localhost src-dir]# mv gmp-4.2.0 gcc-4.4.4/gmp

?因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用 --without-headers这个选项。否则会有很多*.h头文件找不到的报错

?--enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只需支持C语言。虽然配置为c,c++也可以的

?--disable-threads 是因为threads需要libc的支持。

?--disable-decimal-float,需要libc的支持,而我们在初步编译的时候尚未生成libc,否则出

现以下的报错:

../../../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory

../../../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c: In function '__dfp_test_except': ../../../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function)

../../../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is reported only once

../../../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.)

?--disable-shared,既然是第一次安装ARM交叉编译工具,那么本机的glibc支持的应该是本机的编译工具库,而不是ARM交叉编译工具库。forces GCC to link its internal libraries statically,没有这个选项,会有 crti.o: No such file: No such file or directory collect2: ld returned 1 exit status

注:由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。

同样,由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加两个定义:-D inhibit_libc -D _gthr_posix_h 原文:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC 改后:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D _gthr_posix.h 编译:

[root@localhost src-dir] #cd $PRJROOT/build-dir/build-gcc

[root@localhost build-gcc]# ../../src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-shared --disable-threads --disable-decimal-float --disable-libmudflap --disable-lipssp [root@localhost build-gcc]# make all-gcc [root@localhost build-gcc]# make install-gcc [root@localhost build-gcc]# make all-target-libgcc

联系合同范文客服:xxxxx#qq.com(#替换为@)