微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm gcc交叉编译工具链建立

arm gcc交叉编译工具链建立

时间:11-09 来源:互联网 点击:

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--

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top