前言
一直想在MAC系统下搭建路由器的开发环境,OpenWrt官方已经全面支持MAC系统下编译,然而,MT7620的uboot却始终无法顺利编译。原因在于,MT7620的uboot需要用到老版本的gcc342来进行编译,因此,如何在MAC环境中编译gcc342成为本文讨论的重点。
准备工作
下载binutils-2.24.tar.bz2和gcc-3.4.2.tar.bz2源码。二者缺一不可,binutils用于生成as(汇编语言编译器)。
编译
在编译binutils的时候,出现一处错误:
as.c: In function 'dump_statistics': as.c:977:3: error: 'sbrk' is deprecated (declared at /usr/include/unistd.h:582) [-Werror=deprecated-declarations] char *lim = (char *) sbrk (0); ^ as.c: In function 'main': as.c:1146:3: error: 'sbrk' is deprecated (declared at /usr/include/unistd.h:582) [-Werror=deprecated-declarations] start_sbrk = (char *) sbrk (0); ^ cc1: all warnings being treated as errors make[4]: *** [as.o] Error 1 make[3]: *** [all-recursive] Error 1 make[2]: *** [all] Error 2 make[1]: *** [all-gas] Error 2 make: *** [all] Error 2
http://stackoverflow.com/questions/20426213/error-building-ellcc
设置编译参数:
./configure --prefix=/opt/mips-gcc --target=mipsel-linux --disable-werror
编译通过。
总结
编译binutils时,需要
./configure --prefix=/opt/mips-gcc --target=mipsel-linux --disable-werror
编译gcc342时,需要
./configure --prefix=/opt/mips-gcc --target=mipsel-linux --enable-languages=c --without-headers --with-newlib --disable-shared --disable-threads
然后分别make,sudo make install
最后编译uboot时,出现了这些错误:
sed: RE error: illegal byte sequence "/opt/mips-gcc/bin"/mipsel-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec "/opt/mips-gcc/bin"/mipsel-linux-objcopy --gap-fill=0xff -O binary u-boot uboot.bin #temp.bin ===============<<IMPORTANT>>================== Notes:Uboot firmware is uboot.bin NOT uboot.img ================================================ /bin/sh: readelf: command not found ./tools/lzma --best --keep uboot.bin ./tools/lzma: ./tools/lzma: cannot execute binary file make: *** [uboot.img] Error 126
这些问题应该就比较好解决了。
对于sed: RE error: illegal byte sequence,可以参考http://stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x
在sed命令前加入 LC_ALL=C sed ...
对于 readelf的问题,可以用sudo port install binutils,得到greadelf
至于lzma,相信聪明的你已经想到解决的办法了