建立交叉编译器 联系客服

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

[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。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找C链接库的替代品,在这里现以标准GNU C为例建立工具链。 [root@localhost build-gcc] #cd $PRJROOT/src-dir

[root@localhost src-dir] # tar jxvf ../setup-dir/glibc-2.11.2.tar.bz2 [root@localhost src-dir] # tar jxvf ../setup-dir/glibc-ports-2.11.tar.bz2

[root@localhost src-dir] # mv -v glibc-ports-2.11 glibc-2.11.2/ports [root@localhost src-dir] # cd glibc-2.11.2

[root@localhost glibc-2.11.2]#patch -Np1 -i ../../setup-dir/glibc-2.11.2-gcc_fix-1.patch [root@localhost glibc-2.11.2]#patch -Np1 -i ../../setup-dir/glibc-2.11.2-makefile_fix-1.patch [root@localhost glibc-2.11.2] # cd $PRJROOT/build-dir/build-glibc

[root@localhost build-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../../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=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes [root@localhost build-glibc] # make [root@localhost build-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) 如果编译出错

1.configure:error:forced unwind support is required 在configure中增加参数libc_cv_forced_unwin=yes 2.error:the compiler must support C cleanup handlin 在configure中增加参数libc_cv_c_cleanup=yes

这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。

经过查看,发现libc.so中的GROUP已经是交叉编译链的目录,所以不用更改 对 libc.so 的修正.

[root@localhost build-glibc] # vi $PREFIX /${TARGET}/lib/libc.so 去掉绝对路径,修改后的内容如下: /* GNU ld script

Use the shared library, but some functions are only in the static library, so try that secondarily. */

OUTPUT_FORMAT(elf32-littlearm)

GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) ) 八、建立全套编译器 (full gcc)

[root@localhost build-gcc] #../../src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --enable-shared [root@localhost build-gcc] #make all [root@localhost build-gcc] #make install

我们再来看看$PREFIX/bin 里面多了哪些东西。你会发现多了arm-linux-g++ 和 arm-linux-c++ 几个文件。

G++-gnu的 c++ 编译器。 C++-gnu 的 c++ 编译器。

至此,整个交叉编译环境就建立完成了。 九、完成工具链的设置

root@localhost build-gcc] # cd $TARGET_PREFIX/bin 查看文件是否为二进制文件:

[root@localhost bin] # file as ar gcc ld nm ranlib strip 查看缺省的搜寻路径:

[root@localhost bin] #arm-linux-gcc -print-search-dirs 十、测试和验证交叉编译工具

下面编写一个简单的C程序,使用建立的工具链。 [root@localhost bin] #cd $PRJROOT/program [root@localhost program] #vi hello.c #include int main(void) {

printf(\ return 0; }

[root@localhost program] #arm-linux-gcc hello.c -o hello -static (制作静态可执行文件) 制作的可执行文件hello可以直接在目标机上运行.

注:在整个编译器编译过程中可能会报些错误,一般是缺少系统组件导致的,安装下即可。