arm_linux移植手记(一)——交叉工具链编译(下)

    编译前文那点东西可是花了我几天时间,而且很多还是不明白,只是参考中都是这样,不这样就报很多错误。在编译的过程中,也发现下载的源码包中的帮助文档还是有些不方便,应该是我不了解所致吧。没什么基础又想编译的可以先看前文提供的参考,有个了解,再在碰到错误的时在这里候查下,我倒是很推荐国外的那个Cross-Compiled Linux From Scratch,讲解的非常详细全面,而且不光是在嵌入式,主页上其它方面也是很多,直接是linux从零开始,可以仔细看看。但就没有这样的中文可惜,下面进入正题:
  1.准备
    首先说明源码包,要的是binutils、gcc、glibc就不多说了,gmp和mpfr是在初次编译gcc的时候需要的,而glibc-ports是在编译glibc时,直接将其解压后的目录复制到glibc目录下,改名为ports即可,要这个包,是让glibc能够支持arm,至于为什么不在核心目录里直接加我就不管那许多了。。。。。。补充一下,编译的ABI是EABI的,因此target设置为arm-none-linux-gnueabi,命名只是在makefile中找到了,具体详细列表希望知道的人告诉我文档。
    原来一直都是在redhat下做,后来到fedora还都挺习惯,突然换了个debian,有点不适应,安装后是没有开发环境的,全部都要重新来,因此有了“安装一些必备的东西”,不过,libncurses*这个是为编译内核需要的。还好非常方便,以后用多了可能就习惯了。
  2.问题罗列
  (1)编译binutils
   这个一般是没有什么错,要是碰到如下问题:
make[2]: *** [info-recursive] 错误 1
make[2]: Leaving directory `/opt/arm_linux/build-tools/build-binutils/build/bfd'
make[1]: *** [all-bfd] 错误 2
make[1]: Leaving directory `/opt/arm_linux/build-tools/build-binutils/build'
    就是头脑有些昏了,应该直接在configure文件所在文件夹编译的。
  (2)生成内核头文件
    这个一般也没问题,如果遇到
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
 *** 
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
    就是需要前面提到libncurses*的安装
    (3)初编译gcc
    这里可能就有一些错误了:
    配置(configure)
    执行configure时,不能和configure同一个文件夹下,并且后面的选项不要偷懒,不然不知道哪些库之类的缺失了,而且完全编译gcc是需要glibc的,而你现在还没有glibc呢。
    编译
    使用make all-gcc all-target-libgcc
    错误1:
checking for gmp internal files... configure: error: header files gmp-impl.h and longlong.h not found
make: *** [configure-mpfr] 错误 1
    缺少gmp,配置选项中gmp、mpfr的目录要加上-with-mpfr=$PREFIX --with-gmp=$PREFIX,或者像前文参考文章中说的,只是我没有成功,所以直接安装加上了。
    错误2:
../../../libgcc/../gcc/crtstuff.c: In function '__do_global_dtors_aux':
../../../libgcc/../gcc/crtstuff.c:301: error: '__DTOR_LIST__' undeclared (first use in this function)
../../../libgcc/../gcc/crtstuff.c:301: error: (Each undeclared identifier is reported only once
../../../libgcc/../gcc/crtstuff.c:301: error: for each function it appears in.)
make[1]: *** [crtbegin.o] 错误 1
    这个错误有点遥远,因为在此是编译带有EABI的,因此如果前面在编译binutils时没有设置好target,应为arm*-*-linux-gnueabi,没有加上gnueabi,将会在这里出现问题,只能再来一次,把binutils配置好。
   (3)编译glibc
    配置
    一定和编译gcc一样,不用直接在configure文件所在的文件夹下直接编译,然后是参数不要偷懒,不然又是一样的。
    错误1:
checking sysdep dirs... configure: error: The arm is not supported
    这个问题就是下载glibc-ports的原因,直接复制解压后的glibcports复制到glibc目录下,重命名为ports,然后可能会出现下面错误
    错误2:
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
   可以按提示查看下,我这里的问题是找不到gcc,原来PATH的路径缺少了新编译的bin目录,加上$PREFIX/bin 即可。libc_cv_forced_unwind=yes   libc_cv_c_cleanup=yes这两个引起的错误,大家一看就能反应过来偷懒了。
    编译
    错误1:
checking whether the CFI directive .cfi_sections is supported... no
configure: error: need .cfi_sections in this configuration
    这个错误我是不会解决了,搜索了很多,有说是版本匹配问题,有说因bug修补问题,反正是个新的调试特性,那我惹不起还躲不起么,干脆把我原来用的glibc.2.12换成了没有这一特性的glibc2.11,有好的解决方法还望留言。
    错误:2
arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_eh
collect2: ld returned 1 exit status
   解决方法一个是在其makefile里找到-lgcc_eh这一选项,并删除,这个是不影响的;还有可以是在前文中所述,建立libgcc_eh.a 链接到libgcc.a 
   (4)编译最后的gcc
    到这一步,基本就没什么错误了,只是make的时候,居然发现很多头文件找不到,而且还有些莫名的语法错误,例如:cannot find /lib/libc.so.6 collect2
    那么就将$PREFIX/arm-unknow-linux-gnueabi 目录下的include 和 lib删除(如果没有就直接建链接),重新建个链接到其上层的 include和lib。
    最后补充下,我是先下的glibc,然后看里面的README,找到gcc版本等的,大家不知道有什么好方法寻找匹配的版本么?还有在前文中那么多配置、编译参数,其意义是什么,我真是也不太明白,还好在前文参考的文章里有很多解释,可以细细查下,回头也教教我。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值