静态交叉编译教程

前言

静态交叉编译教程,本文以SS为例。


配置编译环境

安装需要软件

1
apt-get install -y build-essential autoconf autopoint automake git pkg-config

交叉编译工具

下载编译工具

以群晖为例,所有的交叉编译工具下载地址:
https://sourceforge.net/projects/dsgpl/files/
选择对应机型下载。

1
2
3
cd /mnt
wget https://ncu.dl.sourceforge.net/project/dsgpl/DSM%206.1%20Tool%20Chains/Intel%20x86%20Linux%203.10.102%20%28Broadwell%29/broadwell-gcc493_glibc220_linaro_x86_64-GPL.txz
tar Jxvf broadwell-gcc493_glibc220_linaro_x86_64-GPL.txz

自制编译工具

未完成。。。。。。

调整编译环境

自定义参数:
MLIB编译的目标处理器架构;
TOOLCHAINDIR交叉编译工具所在目录;
TOOLCHAIN交叉编译工具bin目录所在目录;
HOST交叉编译工具名称。

1
2
3
4
5
6
7
8
MLIB=x86_64
TOOLCHAINDIR=/mnt
TOOLCHAIN=$TOOLCHAINDIR/x86_64-pc-linux-gnu
HOST=${MLIB}-pc-linux-gnu

PATH_A=$PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PATH=$TOOLCHAIN/bin:$PATH

完成后运行$HOST-gcc -v;返回版本信息说明交叉编译工具配置正常。

创建编译目录

1
2
3
4
5
6
7
8
9
10
11
12
rm -rf /mnt/build/shadowsocks-$MLIB
mkdir -p /mnt/build/shadowsocks-$MLIB && cd /mnt/build/shadowsocks-$MLIB

BASE=`pwd`
SRC=$BASE/src
PREFIX=$BASE/local
PRE=$BASE/lib

mkdir -p $SRC $PRE $PREFIX

PKG_CONFIG_PATH=$PRE/lib/pkgconfig/
LD_LIBRARY_PATH=$PRE/lib/

编译依赖库文件

  1. mbedTLS
  1. pcre
  1. libsodium
  1. libev
  1. libudns
  1. c-ares

注意:软件所需要的依赖库,请查看软件的文档得知。

mbedTLS

1
2
3
4
5
6
7
8
mkdir $SRC/mbedTLS && cd $SRC/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

CC=$HOST-gcc AR=$HOST-ar LD=$HOST-ld LDFLAGS=-static make DESTDIR=$PREFIX install

pcre

1
2
3
4
5
6
7
8
9
mkdir $SRC/pcre && cd $SRC/pcre
ver=8.41
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=$HOST --prefix=$PREFIX --disable-shared --enable-utf8 --enable-unicode-properties
make -j`nproc` && make install

libsodium

1
2
3
4
5
6
7
8
9
10
mkdir $SRC/libsodium && cd $SRC/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=$HOST --prefix=$PREFIX --disable-ssp --disable-shared

make -j`nproc` && make install

libev

1
2
3
4
5
6
7
8
9
mkdir $SRC/libev && cd $SRC/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=$HOST --prefix=$PREFIX --disable-shared
make -j`nproc` && make install

libudns

1
2
3
4
5
6
7
8
mkdir $SRC/libudns && cd $SRC/libudns
git clone git://github.com/shadowsocks/libudns
cd libudns

./autogen.sh
./configure --host=$HOST --prefix=$PREFIX

make -j`nproc` && make install

c-ares

1
2
3
4
5
6
7
8
9
10
11
12
mkdir $SRC/c-ares && cd $SRC/c-ares
ver=1.13.0
wget https://c-ares.haxx.se/download/c-ares-$ver.tar.gz

tar zxvf c-ares-$ver.tar.gz
cd c-ares-$ver

sed -i 's#\[-\]#[1.13.0]#' configure.ac
./buildconf
./configure --prefix=$PREFIX --host=$HOST CC=$HOST-gcc --enable-shared=no --enable-static=yes

make -j`nproc` && make install

编译软件

  1. shadowsocks-libev
  1. simple-obfs

shadowsocks-libev

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir $SRC/shadowsocks-libev && cd $SRC/shadowsocks-libev
ver=3.1.0
git clone git://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$PREFIX/lib" CFLAGS="-I$PREFIX/include" \
./configure --host=$HOST --prefix=$PREFIX --disable-ssp --disable-documentation \
--with-mbedtls=$PREFIX --with-pcre=$PREFIX --with-sodium=$PREFIX

make -j`nproc` && make install

simple-obfs

1
2
3
4
5
6
7
8
9
10
11
12
mkdir $SRC/simple-obfs && cd $SRC/simple-obfs
ver=0.0.3
git clone https://github.com/shadowsocks/simple-obfs
cd simple-obfs
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$PREFIX/lib" CFLAGS="-I$PREFIX/include" \
./configure --host=$HOST --prefix=$PREFIX --disable-ssp --disable-documentation

make -j`nproc` && make install

去除符号表

1
2
3
4
5
cp $PREFIX/bin/ss-* $BASE
cp $PREFIX/bin/obfs-* $BASE
$HOST-strip $BASE/obfs-*
$HOST-strip $BASE/ss-*
cd $BASE

还原环境变量

1
2
3
4
PATH=$PATH_A

echo
echo "Done!"