最近入手了一个RG100A-BA,因为要使用ADSL功能,所以放弃考虑OpenWRT系列固件。
发现网上盛传的一个路由器固件可以刷给RG100A-BA,而且还比较稳定,并且还是开源的。
所以下载了一份源码,打算自己编译玩玩。折腾了几天,终于搞定,写篇文章记录一下~
提示: 在32位linux系统中可能遇到的问题要比64位系统中要少一些。
源码下载: A731-406CTL-C01_R04.tar.gz
编译环境: Ubuntu 15.04 x64
安装环境的配置:
下载并解压缩源码包,可以使用 consumer_install 脚本来进行安装环境的配置。
或者直接解压缩 uclibc-crosstools-gcc-4.4.2-1.tar.bz2 到 /opt/toolchains/uclibc-crosstools-gcc-4.4.2-1 目录下。
默认 bcm963xx_4.06L.02_consumer.tar.gz 也应该解压到 /opt/ 下面的,不过解压到别处也可以正常编译。
解压后 bcm963xx_4.06L.02_consumer.tar.gz 后进入到真正的源码根目录里面,因为原版的Makefile会验证make和系统kernel的版本,不一样会提示错误,导致无法继续进行编译。所以需要修改一下Makefile的几处代码。
在第39行:
all: make_version_check kernel_version_check all_postcheck1
将make_version_check和kernel_version_check删除即可:
all: all_postcheck1
修改完成后保存,可以进行编译操作了。
编译路由器固件:
打开终端并进入源码根目录,执行命令:
make PROFILE=AR-5382u_CTL
可用的配置,可以进入targets目录下面查看,不过好像只有AR-5382u_CTL是可用的。
等待一段时间,可能会出现以下错误:
fakeroot: preload library not found, aborting.
这是因为fakeroot脚本中默认的fakeroot路径在 /opt/bcm963xx/hostTools/fakeroot ,
当源码没有解压到 /opt/bcm963xx 就会出现这种情况。
对于源码路径不对应的情况下,可以通过修改源码根目录下的Makefile来解决。
在第662和第665行:
cd $(TARGETS_DIR); $(HOSTTOOLS_DIR)/fakeroot/fakeroot ./buildFS2
修改成下面代码即可:
cd $(TARGETS_DIR); $(HOSTTOOLS_DIR)/fakeroot/fakeroot -l $(HOSTTOOLS_DIR)/fakeroot/.libs/libfakeroot.so -f $(HOSTTOOLS_DIR)/fakeroot/faked ./buildFS2
修改完成后重新回到源码根目录,重新make:
make PROFILE=AR-5382u_CTL
在编译userspace目录下的代码时,可能因为缺少 uclibc-crosstools-gcc-4.2.3-3 交叉工具链而中断编译过程。
可以下载EVG2000_v2.2.0.12_with_toolchain_src.tar.bz2.zip文件,并提取其中的交叉工具链解压到 /opt/toolchains/uclibc-crosstools-gcc-4.2.3-3 目录下。
如果在64位系统下,还可能出现以下错误:
ld.so: object 'libfakeroot.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32)
解决方法: 切换到 hostTools/fakeroot 目录下,运行:
make clean autoreconf -ivf make
出现这种错误的原因是,fakeroot的库和Makefile是预构建于i686的,64位linux加载存在一些问题,只要重新配置生成Makefile再make就可以了。
同样,修改完成后还需要重新回到源码根目录,重新make:
make PROFILE=AR-5382u_CTL
等待一会儿~~~如果终端输出以下提示,说明构建成功了~
-e Done! Image AR-5382u_CTL has been built in /****/images. -e Done! Release Files AR-5382u_CTL have been put in /****/targets/AR-5382u_CTL/release.
其它错误以及解决方案:
错误提示:
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
原因:
64位linux缺少32位运行库。
解决方法:
sudo apt-get install lib32stdc++6