找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 34122|回复: 17

新手编译华硕AC68U梅林固件能运行的s-s-libev

[复制链接]
发表于 2015-1-24 16:10 | 显示全部楼层 |阅读模式
文章地址:http://jiyee.org/2015/01/24/build-s-s-libev-for-asus-ac68u-router-running-on-merlin-firmware/

为ASUS-AC68U-Merlin固件交叉编译s-s-libev
----
开篇向Merlin固件 (https://github.com/RMerl/asuswrt-merlin)及Wiki (https://github.com/RMerl/asuswrt-merlin/wiki)致敬,向tengattack写下的《为R6300v2新固件交叉编译s-s-libev (https://bless.moe/blog/po/1027)》一文致敬。

背景
本文基本参照了以上两篇文章,经过两个漫漫长夜,终于鼓捣出能够在ASUS-AC68U Merlin固件上运行的s-s-libev。

上周刚买了华硕AC68U路由器,看中的就是强大的配置和能够足够鼓捣的空间。但是,本人是个前端开发工程师,目前正在朝iOS开发工程师转行,对于怎么样编译固件,编译固件应用,甚是无知。

什么交叉编译,ARM平台,编译器,基本库等等内容,基本处于很无知的阶段,虽然也用Mac和Linux平台,但是对于C/C++环境里的一切了解甚少。

曲折的过程
好吧,那既然闪闪亮的路由器已经到家了,翻越长城的欲望怒不可止。心想一定要搞到一个能够运行在路由器上的s-s。一路Google,发现根本没有人做过这件事,基本没可能直接拿现成的,看来只能自己编译了。之前看到了Merlin源代码里有一个README.TXT (https://github.com/RMerl/asuswrt-merlin/blob/master/README.TXT),有写怎么样配置编译环境和怎么编译固件,但是后来发现这个文档是基于MIPS平台,而AC68U却是ARM平台,文档过时了。。。另外,找到Merlin固件也能够支持Entware (https://github.com/RMerl/asuswrt-merlin/wiki/Entware),但是却又说:
Note that Entware is only available on the MIPS-based routers. This means the RT-AC56U and RT-AC68U are not supported.

好吧,那继续google和翻论坛帖子,国内恩山论坛上搜索AC68U帖子数还很少,国外smallnetbuild (http://forums.smallnetbuilder.com)上也不多,估计是AC68U的用户基数比较少,而愿意折腾的同学会选择性价比更高的其他型号。

最后,不知道哪儿看到一篇文章 (http://wiki.openwrt.org/doc/devel/crosscompile)说OpenWRT固件里可以把需要编译的应用放到packages里,能就基本SDK编译了。虽然这段话到现在还不知道怎么理解,但至少提供了一个思路,那就是先编译一个编译Merlin固件看看。

编译固件需要编译平台,看Merlin作者推荐Ubuntu,我就用Vagrant搭建了Ubuntu环境,下载了Ubuntu 14.04 64bit的box(64bit还是给后面工作埋下了坑),成功加载运行,链接本地/Users/jiyee/Vagrant目录到虚拟机的/vagrant目录。Merlin固件源代码之前已经clone(好大,有4Gb),就放在/Users/jiyee/Vagrant目录。这一步走的比较顺利。

然后,按照Merlin Wiki (https://github.com/RMerl/asuswrt ... source-using-Ubuntu)里的配置编译环境的步骤,一步步设置,通过apt-get安装一堆编译工具,配置$PATH,最后执行make rt-ac68u。看一篇文章 (http://see.sl088.com/wiki/%E7%BC ... t%E5%9B%BA%E4%BB%B6)说固件编译很慢,就合上电脑睡觉了。第二天醒来一看,有报错,很正常,”编译固件有报错很正常”,心想。但是,错误提示一大堆,基本也看不懂。想到轮胎上问问作者,后来一想环境不一样,估计问了也白问,还得注册论坛,写一篇英文帖子去描述,粘贴一堆编译信息,想想就累,遂放弃了。不过,至少我配置好了编译环境,小开心。退一步说,即便能够编译出固件我也不知道下一步该怎么办。

这一下打击让我歇了两天,两天之后再次兴起想到这件事,翻出原来google来的那些博客文档,看到了tengattack写的《为R6300v2新固件交叉编译s-s-libev (https://bless.moe/blog/po/1027)》一文,虽然这篇文章之前也草草看过,没看明白,所以决定这次认真看看。

在配置环境的过程中,我了解到了uclibc (http://www.uclibc.org/)编译环境,它是嵌入式平台的编译库,看到这篇文章花很大力气从uclibc编译环境迁移到musl。google到musl (http://www.musl-libc.org/),看到主页上有一个链接《See how musl compares to other major libcs.》 (http://www.etalabs.net/compare_libcs.html),一眼就看到了glibc,那不是GNU的C Library么(我还是知道一点的),推测uclibc,musl,glibc都是一回事,只是C Library在不同平台上的实现或是同一平台上的不同实现。心想,我都不用uclibc迁移到musl,因为Merlin固件就是在uclibc环境下编译的,省事。

作者也没提编译固件的事,直接上来就编译程序了,看来有点眉目了。

那好吧,我明白了交叉编译的最基本概念,就是在一个平台编译另一个平台能运行的程序。就写了一个最基本的C代码,hello.c。

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}


运行gcc hello.c -o hello,编程成功,运行./hello,成功打出了Hello World!。这是C语言学习的第一步,而我却拿来验证了编译器是否能成功执行。

然后运行arm-uclibc-linux-2.6.36-gcc hello.c -o hello,报错,傻眼。

/opt/brcm-arm/bin/../libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory

google一番之后,说有让执行ldd /opt/brcm-arm/libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1看看动态链接库是否完整,一看果然有Not Found。

   linux-gate.so.1 =>  (0xf77bf000)
   libmpc.so.2 => not found
   libmpfr.so.4 => not found
   libgmp.so.10 => not found
   libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf77aa000)
   libelf.so.1 => /usr/lib/i386-linux-gnu/libelf.so.1 (0xf7792000)
   libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf75e3000)
   /lib/ld-linux.so.2 (0xf77c0000)

有三个so包没有能链接,在/usr/lib/i386-linux-gnu/目录里果然没有libmpc.so.2等文件。再一番google,意思是装个32位链接库看看 (http://unix.stackexchange.com/qu ... nux-gnu-libgmp-so-3),执行apt-get install ia32-libs,安装错误。。。漫漫过程中一个库网络链接好像失效了,安装失败。这个时候在stackoverflow上看到了一个帖子 (http://stackoverflow.com/questio ... t-open-shared-objec)说,是否正确设置了LD_LIBRARY_PATH环境变量。心想,Merlin固件的Wiki里没有提到呀,什么东西呀,那先echo $LD_LIBRARY_PATH看看,一echo为空,再在/opt/brcm-arm目录里找找,也有一个lib目录,里面就有那些缺失的文件。那就设置export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/brcm-arm/lib:/usr/local/lib:/usr/lib。再执行ldd /opt/brcm-arm/libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1 ,内容发生了变化,都能找到了。

   linux-gate.so.1 =>  (0xf76f4000)
   libmpc.so.2 => /opt/brcm-arm/lib/libmpc.so.2 (0xf76de000)
   libmpfr.so.4 => /opt/brcm-arm/lib/libmpfr.so.4 (0xf768e000)
   libgmp.so.10 => /opt/brcm-arm/lib/libgmp.so.10 (0xf7631000)
   libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7620000)
   libelf.so.1 => /usr/lib/i386-linux-gnu/libelf.so.1 (0xf7608000)
   libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7459000)
   libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7412000)
   /lib/ld-linux.so.2 (0xf76f5000)

再次执行arm-uclibc-linux-2.6.36-gcc hello.c -o hello,编译成功,执行./hello,报错
bash: ./hello: cannot execute binary file: Exec format error

欣喜,貌似成功了。那把编译出来的hello文件scp到路由器上再执行,成功打印了Hello World!,哇哦,看来离成功不远了。

再看了一遍那篇文章,照猫画虎的写下了以下编译命令:

CC=arm-uclibc-linux-2.6.36-gcc CXX=arm-uclibc-linux-2.6.36-g++ AR=arm-uclibc-linux-2.6.36-ar RANLIB=arm-uclibc-linux-2.6.36-ranlib ./configure --prefix=/vargrant/s-s-libev --host=arm-uclibc-linux
make && make install

/vargrant/s-s-libev/src目录下出现了4个可执行文件。成功了。。。我哭啊,赶紧再scp到路由器,执行./ss-local -s server_ip -p 8080 -l 7070 -k password -v -m aes-256-cfb,又成功了。。。在本地配置SOCKS5代理,嗖嗖地翻出了万里长城。
----
后记

哇哈哈,洋洋洒洒写了这么多,虽然实质内容没多少,也基本都是别人的,但是对于一个不懂交叉编译甚至是编译原理的同学来说成功能够搞定这一切,还是很值得欣慰的。我把其中经历的每一步都详实地写下来,把其中参考过的文档都附上链接地址,只是希望能够给像我这样的同学作一点参考,在茫茫google搜索结果里找到一点点希望。

其实,很多文章在第一次google的时候会被忽略,写太多了,看不懂。第二次google的时候会被扫过,挑重点看看。第n次google的会被关注,醍醐灌顶,深深受益。因为你每一次都站上了不同的高度,直到你够到了作者的高度。最后,当你自己想写下什么的时候,他们会被感谢,因为没有他们,你就无法完成这一切。

最后,为了google,感谢google。
----
可执行文件
附上s-s-libev编译之后的可执行文件:
http://jiyee.org:8000/s-s-libev/ac68u.tar (http://jiyee.org:8080/s-s-libev/ac68u.tar)
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-1-24 17:37 | 显示全部楼层
在路由器上运行有什么用  又不能翻出去啊

点评

编译了shadowsocks-libev的话,里面提供了ss-redir,就能实现路由器上的透明代理。  详情 回复 发表于 2015-1-24 23:22
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-1-24 17:37 | 显示全部楼层
真的不错!

从开始到熟悉这过程,是迷惑到激动的转变,其中付出,也只有自己能够,体会;

感谢分享!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-1-24 20:12 | 显示全部楼层
Holy!!,是不是真的,等到现在了,立刻试用。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2015-1-24 23:22 | 显示全部楼层
jeromeli 发表于 2015-1-24 17:37
在路由器上运行有什么用  又不能翻出去啊

编译了shadowsocks-libev的话,里面提供了ss-redir,就能实现路由器上的透明代理。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-1-25 00:28 | 显示全部楼层
能指导下怎么用么。。。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-1-25 09:04 | 显示全部楼层
就是呀,不会用呢,是直接放到JFFS下么?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-2-2 21:13 | 显示全部楼层
你好 我也是AC68U的用户 现在在用WNDR3800 openwrt跑SS,想向你请教一下AC68U的编译方法,能告知下QQ方便联系吗?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-2-4 13:43 | 显示全部楼层
楼主,您好,您分享的链接电信实在下载不动,每秒只有几个字节的速度哎
能否好人做到底,分享个百度云?顺便再指导一下我等普通群众这个如何使用,非常感谢!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-2-6 13:55 | 显示全部楼层
楼主还有在更新嘛~~
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-2-10 19:31 | 显示全部楼层
这个可以运行在AC87U上吗?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-2-10 22:21 | 显示全部楼层
ss-[local|redir|server|tunnel]

       -s <server_host>           host name or ip address of your remote server

       -p <server_port>           port number of your remote server

       -l <local_port>            port number of your local server

       -k <password>              password of your remote server

       [-m <encrypt_method>]      encrypt method: table, rc4, rc4-md5,
                                  aes-128-cfb, aes-192-cfb, aes-256-cfb,
                                  bf-cfb, camellia-128-cfb, camellia-192-cfb,
                                  camellia-256-cfb, cast5-cfb, des-cfb, idea-cfb,
                                  rc2-cfb, seed-cfb, salsa20 and chacha20

       [-f <pid_file>]            the file path to store pid

       [-t <timeout>]             socket timeout in seconds

       [-c <config_file>]         the path to config file

       [-i <interface>]           network interface to bind,
                                  not available in redir mode

       [-b <local_address>]       local address to bind,
                                  not available in server mode

       [-u]                       enable udprelay mode,
                                  not available in redir mode

       [-L <addr>:<port>]         specify destination server address and port
                                  for local port forwarding,
                                  only available in tunnel mode

       [-d <addr>]                setup name servers for internal DNS resolver,
                                  only available in server mode

       [--fast-open]              enable TCP fast open,
                                  only available on Linux kernel > 3.7.0

       [--acl <acl_file>]         config file of ACL (Access Control List)
                                  only available in local and server mode

       [-v]                       verbose mode

notes:

    ss-redir provides a transparent proxy function and only works on the
    Linux platform with iptables.
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-3-8 23:30 | 显示全部楼层
本帖最后由 sseepsse 于 2015-3-8 23:37 编辑

今天搞了一天,也编译出来了,虽然entware-arm出来了~~
不过感觉很坑爹,2.1.4的版本ss-redir监听的是127.0.0.1,不能读取配置,除非手动指定到0.0.0.0,无论entware-arm还是源代码编译的都一样bug,靠靠靠。。。。。--------------------------

反应过来了,用libev源的是给电脑用的,默认是127.0.0.1,用openwrt源的话会修正,估计entware-arm里面就是用的libev的源,得手动修改才能用,不然路由器上无效~
不过那个libev版的就算-c 指定配置都改不了,肯定是bug。。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-3-9 11:35 | 显示全部楼层
不急,会有艰辛的过程吧,我对这完全不懂。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-4-21 21:20 | 显示全部楼层
我也编译出来了,和13楼是一样的问题,开ss-local是尝试置顶-b 0.0.0.0是能用,但是还有个问题就是ss-server无论怎么都用不了,提示Segmentation fault,无奈
发现merlin固件的openssl加密库版本是1.0.0p,这也太老了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-25 07:50

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表