@aod321
2019-01-06T10:47:35.000000Z
字数 3812
阅读 336
Openwrt
交叉编译
目标主机硬件:newifi mini
编译宿主机系统: Ubuntu 16.04.5 x64(用的是一台旧金山的远程VPS)
CPU :mt7620n
系统版本:openwrt 15.05.01
实例:
1.交叉编译shadowsocks-libev.ipk
2.交叉编译简单的HelloWord
3.交叉编译自己的IPK (留给你当课后作业,自学吧)
本文所有操作均以root用户操作,事实上openwrt官方并不推荐这种方式来编译,而是推荐先创建个普通用户然后实施操作
#Centos系统
yum groupinstall 'Development Tools'
yum install -y git-core subversion binutils bzip2 gcc gcc-c++ gawk gettext flex unzip gawk ccache
yum install -y ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker
yum install -y glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget
#ubunut系统
sudo apt-get update
sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk ccache
wget http://archive.openwrt.org/chaos_calmer/15.05.1/ramips/mt7620/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
tar -xjvf OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
# SDK在用户目录下,这里我们假设你是root用户
export STAGING_DIR=/root/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
export PATH=$PATH:$STAGING_DIR/bin
测试一下环境变量有没有添加成功,在任意目录下执行
mipsel-openwrt-linux-gcc
提示
mipsel-openwrt-linux-gcc: fatal error: no input files
compilation terminated.
即为配置成功
cd OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64
./scripts/feeds update -a
./scripts/feeds install -a
这步可能会有几个warning,不用管它
make menuconfig
一切正常就会进入熟悉的选择界面,这里只是测试一下,进去后先退出来
下面进行对具体的IPK包进行交叉编译
#创建目录
mkdir helloworld
cd helloworld
#创建源码文件
touch helloworld.c
helloworld.c的内容如下:
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
这个问题很简单,只要我们在本机用openwrt提供的编译器来编译我们的程序便可.完整工具链在SDK目录下的staging_dir下,这里我们需要的gcc编译器在SDK对应工具链的bin目录下
#设置环境变量,如果上面已经设置过请忽略
export STAGING_DIR=/root/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
export PATH=$PATH:$STAGING_DIR/bin
#编译
cd ~/helloworld
mipsel-openwrt-linux-gcc hellowrod.c -o hello.o
本来想随便举个例子,结果用的是最新的shadowsocks-libev,在旧系统上的SDK上编译新版的SS遇到了一系列的坑,主要包括:
所以按照本教程编出来的SS最好把mbedtls,libsodium-1.0.11的ipk也连着SS一起传上去安装
#进入到SDK目录下,输入
svn checkout https://github.com/wongsyrone/lede-1/trunk/package/libs/mbedtls package/libs/mbedtls
本文编译的shadowsocks-libev版本比较新,为了支持chacha20-ietf,libsodium的版本必须大于1.0.6,但是15.05默认的MakeFile却是1.0.2,所以这里需要解决libsodium的版本问题
以下方法可以将libsodium更新到1.0.11
手动方法:对feeds/packages/libs/libsodium/Makefile文件进行修改版本号,下载链接,Hash值,前缀等操作,详细的懒得写了,参考上传的修改后Makefile吧
用修改过的MakeFile去替换原来的Makefile
mkdir newMakefile
cd newMakefile
https://github.com/aod321/packages/raw/master/libs/libsodium/Makefile
cp -f Makefile ~/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/feeds/packages/libs/libsodium/Makefile
#进入SDK目录
cd OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/
# 添加 feeds
git clone https://github.com/shadowsocks/openwrt-feeds.git package/feeds
# 获取 shadowsocks-libev Makefile
git clone https://github.com/shadowsocks/openwrt-shadowsocks.git package/shadowsocks-libev
# 选择要编译的包 Network -> shadowsocks-libev
make menuconfig
# 开始编译
make package/shadowsocks-libev/compile V=99
编译完成后在/bin/ramips/packages/base目录下将编译好的libmbedtls.ipk,libsodium-1.0.11.ipk,和shadowsocks的ipk上传到路由器同一目录下安装即可.
make menuconfig这里可能会出现一个错误
'feeds/base/package/utils/busybox/config/Config.in:818: glob failed: No files found "package/utils/busybox/config/libbb/Config.in"'
在SDK目录下输入
ln -s ../feeds/base/package/utils package/utils