使用crossdev安装龙芯的O32 gnu交叉工具链

先来介绍一下n32和O32是啥,N32和O32就是MIPS系统上不同的ABI,即Application Binary Interface。MIPS体系结构最早只有o32的系统,但后来改进了寄存器的功能和分配方式,于是就又有了N32,相对于O32,N32的速度更快些。但二者目前在龙芯系统上还无法兼容。因为龙芯目前官方只支持O32,而N32有只有zhllg的overlay中有,所以使用gentoo来安装O32的工具链需要额外解决些问题,所以才有了这篇文章,之所以之前又写了N32的安装方法,是因为有zhllg大牛的技术支持,使得能直接安装N32的工具链。

言归正转,开始安装我们的O32工具链,因为使用crossdev(如果你还不知道什么是crossdev,请参考Gentoo中的交叉编译利器–crossdev),我们仍旧需要配置龙芯的overlay。详细的配置过程参见用crossdev装龙芯的n32 gnu交叉工具链,我这里只简单列出命令:
cd /root
git clone git://www.gentoo-cn.org/var/git/loongson.git
cd /usr/local/portage/
mkdir loongson
cd loongson
ln -s /root/loongson-overlay/sys-libs/ sys-libs ##glibc指向overlay中的glibc
ln -s /root/loongson-overlay/sys-devel/ sys-devel ##将gcc指向overlay中的gcc

接下来修改make.conf,确保/usr/local/portage/loongson在你所有overlay查找的最前面:
PORTDIR_OVERLAY="/usr/local/portage/loongson $PORTDIR_OVERLAY"

这样做是为了确保使用龙芯overlay中的gcc和binutils。

下面还不能直接执行
crossdev -t mipsel-unknown-linux-gnu
因为现在overlay还不支持O32的工具链,需要我们做些修改,这些修改是我安装的时候google并参考zhllg在n32工具链的bugfix做的,目前能正常安装并能编译运行helloworld,应该没有任何问题:)

在目录/usr/local/portage/loongson/sys-libs/glibc下,做如下修改
files/eblits/src_compile.eblit
160a161,167
+ if [[ ${CTARGET} == "mipsel-unknown-linux-gnu" ]] ; then
+ # remove "-32" gcc switch, since gcc for other arch don't have this
+ sed -i '2 s/-mabi=32//g' "${S}"/ports/sysdeps/mips/mips32/Makefile
+ # fix stdio_lim.h missing problem
+ sed -i 's/_MIPS_SZPTR/32/' "${S}"/ports/sysdeps/mips/bits/wordsize.h
+
+ fi
files/eblits/src_install.eblit
203a204,207
+ if [[ ${CTARGET} == "mipsel-unknown-linux-gnu" ]] ; then
+ sed -i 's/\(__WORDSIZE.\+\)\(32\|64\)$/\1_MIPS_SZPTR/' \
+ "${D}"/$(alt_headers)/bits/wordsize.h || die "restore wordsize.h failed"
+ fi

上面修改共三处,第一处解决emerge glibc-header时报的 gcc doesn’t support -mabi=32 错。修改方式是直接删除此选项,因为我们使用x86上的gcc而这个选项是支持O32的gcc才能接受的选项。
第二,三处修改解决同一个问题,Emerging cross-gcc-stage1时出错/usr/mipsel-unknown-linux-gnu/sys-include/stdio.h error: bits/stdio_lim.h: No such file or directory。 对于这个错误,你有两种修改方式,可以直接touch stdio_lim.h这个文件,这是很多手工编译工具链时给的建议。这里我们使用另一种方法,阻止该文件被include到stdio.h中,这是zhllg在N32工具链中使用的方式。

修改完了之后别忘了重新生成ebuild校验。
ebuild glibc-2.10.1.ebuild manifest
ebuild glibc-2.9_p20081201-r2.ebuild manifest

bug修改完成,接下来,你就可以直接使用crossdev安装了。
crossdev -t mipsel-unknown-linux-gnu

Enjoy it!

PS:

  1. 这是自己第一次修改ebuild,呵呵其实很简单,但自己一直都把自己当成用户,没有做过这种事,不敢做,所以浪费了很多时间,看着自己改出来的bug,心情很不一样哈。
  2. 我已经将上面的修改提交给了zhllg,等他做了相应的修改,就可以直接crossdev安装了。请关注此文。

相关文章:

This entry was posted in Linux系统 and tagged , , , , , , , , , , , , , , , , , , . Bookmark the permalink.

2 Responses to 使用crossdev安装龙芯的O32 gnu交叉工具链

  1. zsc says:

    我出离愤怒了,这么好的文章为什么不用邮件转发全组!

    • erlv says:

      @zsc, …….首先,这文章没啥意思,其次这文章和大家做的无关。。。
      你就别再拿小弟开玩笑了:)

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>