一半君的总结纸

听话只听一半君

crosstool-ng 1.22.0 and shadowsocks 2.4.5 备忘录

备份一下配置文件免得忘了,之前的几篇都可以划掉,本文底部有用travis ci build的for tomato K26RT-N kernal 2.6的所有shadowsocks版本下载页面地址,理论上应该直接拷到路由器上就可以运行

  • ct-ng 1.22
    git clone https://github.com/crosstool-ng/crosstool-ng.git
    cd crosstool-ng
    git checkout tags/crosstool-ng-1.21.0
    ./bootstrap 
    ./configure
    make
    make install
    
  • 出toolchain,lz的ct-ng配置文件,uclibc配置文件

    mkdir ~/config
    cd ~/config
    # 可以看下设置 但是不要存,因为lz手动把uclibc 0.9.30.2加回到ct-ng 1.22的菜单里了,如果存了可能又没了
    ct-ng menuconfig
    ct-ng build.4
    
  • 出toolchain

    mkdir ~/config
    cd ~/config
    # 检查下设置
    ct-ng menuconfig
    ct-ng build.4
    
  • 把toolchain加到PATH里

    export PATH=/home/oglop/x-tools/mipsel-unknown-linux-uclibc/bin:$PATH
    
  • zlib

    wget http://zlib.net/zlib-1.2.8.tar.gz
    cd zlib-1.2.8
    tar xvf zlib-1.2.8.tar.gz 
    cd zlib-1.2.8/
    CC=mipsel-unknown-linux-uclibc-gcc CXX=mipsel-unknown-linux-uclibc-g++ AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib ./configure --prefix=/home/oglop/Downloads/zlib-install
    make && make install
    
  • openssl

    git clone https://github.com/openssl/openssl.git
    git checkout tags/OpenSSL_1_0_2g
    CC=mipsel-unknown-linux-uclibc-gcc CXX=mipsel-unknown-linux-uclibc-g++ AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib ./Configure no-asm shared --prefix=/home/oglop/Downloads/openssl-install linux-mips32
    make && make install
    
  • shadowsocks 2.4.5

    git clone https://github.com/shadowsocks/shadowsocks-libev.git
    cd shadowsocks-libev
    git checkout tags/v2.4.5
    # 下面新加了个 --disable-ssp 因为tomato路由器不支持这个
    CC=mipsel-unknown-linux-uclibc-gcc CXX=mipsel-unknown-linux-uclibc-g++ AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib ./configure --disable-ssp --prefix=/home/oglop/Downloads/ss-install  --with-openssl=/home/oglop/Downloads/openssl-install --host=mipsel-uclibc-linux --with-zlib=/home/oglop/Downloads/zlib-install
    make V=99 && make install
    
  • 把编译出来的可执行文件strip并upx得到最后产物

要点:

  • 必须使用uclibc 0.90.3.x,不然会找不到epoll_create1,可能之后的uclibc太新了
  • lz手动编辑了uclibc.config里的KERNEL_HEADERS 还有 CROSS_COMPILER_PREFIX
  • 此外由于ct-ng 1.22里已经把uclibc 0.90.3.x去掉了,所以lz在 /usr/local/lib/crosstool-ng-1.22.0/config/libc/uClibc.in 又把他给加回去了,当然你如果不用ct-ng menuconfig图形配置界面的话,就用不着改,直接改config文件即可
  • table cipher提示
    ./ss-server: can't resolve symbol 'MD5' in lib './ss-server'.
    

    不知如何解决,不过lz反正只用 aes-256-cfb

    edit: lz刚好有空,来研究下此问题

    # 首先先来装个nm, lz有插优盘,有entware
    opkg install binutils
    
    # 首先电脑上看看,确实有
    [oglop@localhost config]$ nm -D /lib/libcrypto.so.10  | grep -i md5
    000c82d0 T EVP_md5
    000d2650 T EVP_rc4_hmac_md5
    000475e0 T MD5
    00047680 T md5_block_asm_data_order
    000473a0 T MD5_Final
    00047570 T MD5_Init
    00047370 T MD5_Transform
    000471c0 T MD5_Update
    00154360 R MD5_version
    000474e0 T private_MD5_Init
    
    # 看看v132的tomato shibby上有没有,额没有,所以应该是没辙了吧
    root@unknown:/tmp/home/root# nm -D  /usr/lib/libcrypto.so | grep -i md5
    00071fb0 T EVP_md5
    0007a22c T EVP_rc4_hmac_md5
    00037b1c T md5_block_data_order
    00038b00 T MD5_Final
    00038a88 T MD5_Init
    00038a70 T MD5_Transform
    00038cc4 T MD5_Update
    00131388 R MD5_version
    

    ss configure里是没做 各种cipher的开关的,他里面也写了If built with PolarSSL or custom OpenSSL libraries, some of these ciphers may not work. 所以你就假装看不见好了

    edit: 如果你强迫症的非要用table cipher,那么可以试试这样。把编译出来的openssl下的libcrypto.so拷到路由器上,把tomato自带的这个文件“换掉“,lz临时试一下

    # 把openssl里的有MD5 symbol的这个.so文件拷到路由器上去
    scp /home/oglop/Downloads/openssl-install/lib/libcrypto.so root@<your-router-ip>:/tmp/home/root
    
    # 把tomato自带的那个文件“替换”掉
    ssh root@<your-router-ip>
    mount --bind ./libcrypto.so /usr/lib/libcrypto.so
    
    # 再开 ss 用 table cipher 看行不行 (确实可行,ss正常工作)
    root@unknown:/tmp/home/root# /jffs/ss/ss-server -k password -p 8090 -m table
     2016-03-26 16:45:06 INFO: initialize ciphers... table
     2016-03-26 16:45:09 INFO: listening at *:8090
    
    # 去掉看行不行( 当然不行:( )
    root@unknown:/tmp/home/root# umount /usr/lib/libcrypto.so
    root@unknown:/tmp/home/root# /jffs/ss/ss-server -k password -p 8090 -m table
     2016-03-26 16:47:13 INFO: initialize ciphers... table
    /jffs/ss/ss-server: can't resolve symbol 'MD5' in lib '/jffs/ss/ss-server'.
    
    

    这样确实可以,但是这样大概会有副作用,lz还是不要瞎搞的好,如果你确定其他功能不会被影响,可以把上面的操作放到启动script里,新拷来的.so文件可以放jffs里或者是优盘上,(因为不管是/usr/lib 还是 /tmp/home/root 都是临时生成的目录,重启后里面的内容就会恢复到默认的状态)

ps: 本文的目的是为了把编译出来的100k的ss可执行文件拷到屌丝路由器(比如磊科q3,rom太小又没有usb口可以插优盘)的/jffs上直接运行,如果你是高级路由器(有usb接口,可插优盘或可插存储卡),只要装entware,然后直接装ss即可

opkg update

opkg install shadowsocks-libev 

# 或者
opkg install shadowsocks-libev-polarssl

文件下载:

lz已经把这些操作自动化,放到travis ci上了,repo在这里,自动build出来的所有的shadowsocks的下载页面在这里(github pages)

配置文件备份,放在了gist上

本地下载:
shadowsocks-libev_2.4.5_mipsel_OpenSSL_dynamic.tar.gz
mipsel-unknown-linux-uclibc.1.22.tar.gz
libcrypto.so.1.0.0.tar.gz
openssl-1.0.2g-dynamic-install.tar.gz

update:

03/05/2016: 更新ss 2.4.6

参考:
如何把travis ci的build结果保存到github pages / tomato适用的shadowsocks libev 自动build

Advertisements

14 responses to “crosstool-ng 1.22.0 and shadowsocks 2.4.5 备忘录

  1. zhu jun 十月 9, 2016 @ 11:50 上午

    我也用着tomato的路由,一直用ss libev这几天突发奇想用ssr libev,但现在tomato人气越来越低,网上找不到现成的,只能自己编译,就找到了你的文章,学习了很多,但自己编译总是失败,能不能麻烦你有时间帮忙编译一份呢?https://github.com/breakwa11/shadowsocks-libev.git 我自己折腾几天了也没弄好

  2. 戴志光 十一月 4, 2016 @ 2:22 下午

    请问Polipo及Privoxy有机会编译好直接拷到RT-N12无U盘,jffs又很小的机器用吗?

  3. Pingback: Cross compile Shadowsocks-libev for DS116 | Michael's Blog

  4. amo amo 十二月 12, 2016 @ 9:07 上午

    一半君你的base OS是Centos 7 32bit吗?我在64bit Ubuntu上各种出错。。。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: