编译前文那点东西可是花了我几天时间,而且很多还是不明白,只是参考中都是这样,不这样就报很多错误。在编译的过程中,也发现下载的源码包中的帮助文档还是有些不方便,应该是我不了解所致吧。没什么基础又想编译的可以先看前文提供的参考,有个了解,再在碰到错误的时在这里候查下,我倒是很推荐国外的那个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版本等的,大家不知道有什么好方法寻找匹配的版本么?还有在前文中那么多配置、编译参数,其意义是什么,我真是也不太明白,还好在前文参考的文章里有很多解释,可以细细查下,回头也教教我。。。。。。