Linux ARM交叉编译工具链制作过程
时间:11-21
来源:互联网
点击:
d 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-omap2/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源码树的根目录下,并分别命名为"gmp"和"mpfr",那么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中添加两个定义:-Dinhibit_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
[root@localhost build-gcc]# make install-target-libgcc
注:很多资料中之有前面两项,这只建立了gcc,没有建立libgcc.a,这样会在glibc的编译中出现-lgcc没有找到的错误。报告:
……/build-tools/build-glibc/libc_pic.a
i586-linux-gcc -nostdlib -nostartfiles -r -o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o -Wl,-( /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-glibc/libc_pic.a -lgcc -Wl,-) -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT
/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4/../../../../ram-linux/bin/ld: cannot find -lgcc
在glibc的编译中,还需要libgcc_eh.a(否则出现错误:-lgcc_eh没有找到……bin/ld: cannot find -lgcc_eh),使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现。
[root@localhost build-gcc]# ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | sed s/libgcc/&_eh/`
Note:arm-linux-gcc与-print-libgcc-file-name之间有一个空格
运行报告:
“/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a” -> “libgcc.a”
装完成后,查看结果:
[root@localhost build-gcc] #ls $PREFIX/bin
如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功
七、编译glibc
这一步是最为繁琐的过程,目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是C链接库libc。因为
[root@localhost
[root@localhost
可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。
复制头文件到交叉编译工具链的安装目录:
[root@localhost
[root@localhost asm] #cp –r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/include
[root@localhost
[root@localhost
root@localhost
root@localhost
Note: mach-xxx是根据目标板所用的cpu类型来选择的
六、建立初始编译器 (boot strap gcc)
这一步的目的主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。安装过程如下:
重命名:
[root@localhost
[root@localhost
[root@localhost
从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么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中添加两个定义:-Dinhibit_libc
原文:
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC
改后:
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D_gthr_posix.h
编译:
[root@localhost
[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
注:很多资料中之有前面两项,这只建立了gcc,没有建立libgcc.a,这样会在glibc的编译中出现-lgcc没有找到的错误。报告:
……/build-tools/build-glibc/libc_pic.a
i586-linux-gcc
/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4/../../../../ram-linux/bin/ld: cannot find -lgcc
在glibc的编译中,还需要libgcc_eh.a(否则出现错误:-lgcc_eh没有找到……bin/ld: cannot find -lgcc_eh),使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现。
[root@localhost build-gcc]#
“/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a” -> “libgcc.a”
装完成后,查看结果:
[root@localhost
如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功
七、编译glibc
LinuxARM交叉编译工具 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)