arm gcc交叉编译工具链建立
t@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/http://www.cnblogs.com/http://www.cnblogs.com/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@localhostbuild-gcc]#ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | seds/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@localhostbuild-gcc] #ls$PREFIX/bin
如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功
1.1.6. 编译glibc
这一步是最为繁琐的过程,目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是C链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找C链接库的替代品,在这里现以标准GNU C为例建立工具链。
[root@localhostbuild-gcc]#cd $PRJROOT/src-dir
[root@localhostsrc-dir]#tar jxvf ../setup-dir/glibc-2.11.2.tar.bz2
[root@localhostsrc-dir]#tar jxvf ../setup-dir/glibc-ports-2.11.tar.bz2
[root@localhostsrc-dir]# mv –v glibc-ports-2.11 glibc-2.11.2/ports
[root@localhostsrc-dir]# cd glibc-2.11.2
[root@localhostglibc-2.11.2]# patch –Np1 -i ../../setup-dir/glibc-2.11.2-gcc_fix-1.patch
[root@localhostglibc-2.11.2]# patch –Np1 -i ../../setup-dir/glibc-2.11.2-makefile_fix-1.patch
[root@localhostglibc-2.11.2]#cd $PRJROOT/build-dir/build-glibc
配置环境变量
[root@localhostbuild-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib
配置
[root@localhostbuild-glibc]../../src-dir/glibc-2.11.2/configure /
--host=arm-linux --prefix=$PREFIX/$TARGET --with-tls --disable-profile
--enable-add-ons --with-headers=$PREFIX/$TARGET/include
libc_cv_forced_unwind=yeslibc_cv_c_cleanup=yes libc_cv_arm_tls=yes
编译
[root@localhostbuild-glibc] #make
[root@localhostbuild-glibc] # make install
注:以上完成后,请查看一下$TARGET_PREFIX/lib目录下的文件libc.so,看看GROUP的内容是否指定到可以用于交叉编译的库,如果不是请修改,如下:
libc.so文件(所在目录是$TARGET_PREFIX/lib),将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改为GROUP (libc.so.6 libc_nonshared.a)
这样连接程序ld就会在libc.so所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
经过查看,发现libc.so中的GROUP已经是交叉编译链的目录,所以不用更改
对libc.so的修正·
vi$PREFIX /${TARGET}/lib/libc.so
去掉绝对路径,修改后的内容如下:
/*GNU ld script
Usethe shared library, but some functions are only in
thestatic library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1.1.7. 建立全套编译器(full gcc)
[root@localhostbuild-gcc]#../../src-dir/gcc-4.4.4/configure --target=$TARGET--
armgcc交叉编译工具 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)