前言


  最近购置了一款 Ubiquiti Networks EdgeRouter X(以下简称 erx) 路由器,基于科学上网的需求,准备在 erx 上安装 shadowsocks。erx 基于 Vyatta/VyOS 的 Debian,由于 er-x 的存储空间只有 256 MB,所以直接在 erx 上编译会由于空间不够导致编译失败。

通过查看手册发现这款路由器的 cpu 是 MediaTek MT7621,那么则可以通过交叉编译直接生成可以执行的二进制文件,编译完成后大约 10M+ 大小,以下是编译过程。

编译


我构建了一个 docker 化的编译仓库开源到了 github 上,可以自动给 mips 以及 mips64 架构交叉编译,欢迎星星。
shadowsocks-erx

基本信息

本次编译的版本基于 madeyeshadowsocks-libev 3.1.1,不在使用之前的 openssl,转而使用 mbedTLS。

编译步骤

1.安装所需编译程序

apt install -y g++-mipsel-linux-gnu gcc-mipsel-linux-
gnu gettext build-essential autoconf libtool libpcre3-
dev asciidoc xmlto libev-dev libudns-dev automake 
libmbedtls-dev libsodium-dev

2.创建临时编译文件夹

ss_path=/usr/local/ss/
mkdir -p $ss_path

3.分别编译依赖包

  • 设定路径
ss_path=/usr/local/ss/
mkdir -p $ss_path
  • 编译 mbedtls
ver=2.5.1
wget --no-check-certificate https://tls.mbed.org/download/mbedtls-$ver-gpl.tgz
tar zxf mbedtls-$ver-gpl.tgz
cd mbedtls-$ver
sed -i "s/DESTDIR=\/usr\/local/DESTDIR=\/usr\/local\/mbedtls/g" Makefile
CC=mipsel-linux-gnu-gcc AR=mipsel-linux-gnu-ar LD=mipsel-linux-gnu-ld LDFLAGS=-static
make && make install
  • 编译 pcre
ver=8.40
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-$ver.tar.gz
tar zxf pcre-$ver.tar.gz
cd pcre-$ver
./configure --host=mipsel-linux-gnu --prefix=/usr/local/pcre --disable-shared --enable-utf8 --enable-unicode-properties
make && make install
  • 编译 libsodium
ver=1.0.13
wget --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-$ver.tar.gz
tar zxf libsodium-$ver.tar.gz
cd libsodium-$ver
./configure --host=mipsel-linux-gnu --prefix=/usr/local/libsodium --disable-ssp --disable-shared
make && make install
  • 编译 libev
ver=4.24
wget http://dist.schmorp.de/libev/libev-$ver.tar.gz
tar zxf libev-$ver.tar.gz
cd libev-$ver
./configure --host=mipsel-linux-gnu --prefix=/usr/local/libev --disable-shared
make && make install
  • 编译 libudns
git clone https://github.com/shadowsocks/libudns
cd libudns
./autogen.sh

./configure --host=mipsel-linux-gnu --prefix=/usr/local/libudns
make && make install
  • 编译 c-ares
wget https://c-ares.haxx.se/download/c-ares-1.12.0.tar.gz
./configure --host=mipsel-linux-gnu --prefix=/usr/local/libcares --disable-shared --enable-utf8 --enable-unicode-properties
make && make install

NaNundefined编译 shadowsocks-libev

ver=3.0.7
git clone https://github.com/shadowsocks/shadowsocks-libev
cd shadowsocks-libev
git checkout v$ver -b v$ver
git submodule init && git submodule update
./autogen.sh
LIBS="-lpthread -lm" LDFLAGS="-Wl,-static -static -static-libgcc -L/usr/local/libudns/lib -L/usr/local/libev/lib" CFLAGS="-I/usr/local/libudns/include -I/usr/local/libev/include" ./configure --host=mipsel-linux-gnu --prefix=/usr/local/shadowsocks-libev --disable-ssp --disable-documentation --with-mbedtls=/usr/local/mbedtls --with-pcre=/usr/local/pcre --with-sodium=/usr/local/libsodium --with-cares=/usr/local/libcares
make && make install

参考资料


  1. lighttpd及pcre的交叉编译 作者: aifeming

  2. Ubnt EdgeRouter X路由交叉编译SS流程 作者: zerosoul

  3. Ubuntu环境下交叉编译Ubnt EdgeRouter ER-X的SS 作者: yangg1991

  4. 交叉编译shadowsocks-libev 作者: haoutil

  5. github issue #929

  6. 在Debian jessie下交叉编译Ubnt EdgeRouter ER-X的SS 作者: SuperMan

  7. CSDN question

  8. shadowsocks-libev Repo

排序不分先后,感谢分享