使用 WSL 交叉编译 MentoHUST

为使得 MentoHUST 在路由器上依然可用,需要对 MentoHUST 针对自己路由器的芯片架构进行交叉编译。本文以使用 MT7620 的路由器平台为例,主要提供 WSL 下对 MentoHUST 进行交叉编译的实例。

限于能力与水平,本文有许多遗漏与不足之处,还请多多指教。

准备工作

  • 一台已刷入 OpenWrt 的路由器

  • 已安装 Linux 系统的实体机或虚拟机 / 已安装 WSL 的 Windows 10

    如果你准备使用 WSL 进行编译,请先参考在 WSL2 上进行 OpenWrt 的编译的 “配置编译环境” 进行 WSL 的相关设置。

安装相关依赖

打开终端,输入:

1
sudo apt install build-essential bison flex zlib1g-dev libncurses5-dev subversion quilt intltool ruby fastjar unzip gawk autogen autopoint ccache gettext libssl-dev xsltproc zip git

下载所需文件

  1. 在终端下前往 home,并创建目录 mt7620 以便组织管理文件。

    1
    2
    3
    cd /home/jim
    mkdir mt7620
    cd mt7620

    目录请根据自己需要命名,这里仅作示范。
    其中 jim 为本示例中的 Linux 用户名,请根据自己的 Linux 用户名修改相关命令。

  2. OpenWrt 的官网下载对应你路由器的芯片和当前版本系统的交叉编译工具包 (SDK)。

    本指南使用 19.07.4 的 SDK

    1
    2
    3
    4
    wget https://downloads.openwrt.org/releases/19.07.4/targets/ramips/mt7620/openwrt-sdk-19.07.4-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64.tar.xz -O sdk.tar.xz
    tar -xJf sdk.tar.xz
    mv openwrt-sdk-19.07.4-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64 sdk
    rm sdk.tar.xz
  3. 下载 libpcap 源码至 libpcap 文件夹,撰文时最新为 1.9.1 版

    1
    2
    3
    4
    wget https://www.tcpdump.org/release/libpcap-1.9.1.tar.gz -O libpcap.tar.gz
    tar -xzf libpcap.tar.gz
    mv libpcap-1.9.1 libpcap
    rm libpcap.tar.gz
  4. 下载 MentoHUST 源码至 mentohust 文件夹。这里使用 @hyrathb 的,请根据自己需要替换源码链接。

    1
    git clone https://github.com/hyrathb/mentohust.git mentohust

交叉编译

配置交叉编译环境

终端输入:

1
2
3
4
5
6
7
8
9
10
11
12
PATH=$PATH:/home/jim/mt7620/sdk/staging_dir/toolchain-mipsel_24kc_gcc-7.5.0_musl/bin
export PATH
STAGING_DIR=/home/jim/mt7620/sdk/staging_dir/toolchain-mipsel_24kc_gcc-7.5.0_musl
export STAGING_DIR
export CC=mipsel-openwrt-linux-gcc
export CPP=mipsel-openwrt-linux-cpp
export GCC=mipsel-openwrt-linux-gcc
export CXX=mipsel-openwrt-linux-g++
export RANLIB=mipsel-openwrt-linux-musl-ranlib
export ac_cv_linux_vers=4.4.60
export LDFLAGS="-static"
export CFLAGS="-Os -s"

请不要直接复制粘贴,需要针对你的实际情况进行修改。

需修改的地方(尖括号部分)有:

  • PATH=$PATH:…/staging_dir/<path>/bin
  • STAGING_DIR=…/staging_dir/<path>
  • CCCPPGCCCXXRANLIB 请对比参考…/staging_dir/<path>/bin 内的对应文件名进行修改
  • RANLIB 要根据 sdk 里目录的结尾修改。这个例子,结尾是 musl,因此 export RANLIB=mipsel-openwrt-linux-musl-ranlib。如果你的结尾是 uClibc,就应该改成 export RANLIB=mipsel-openwrt-linux-uclibc-ranlib
  • ac_cv_linux_vers 为你所编译目标 OpenWrt 当前 Linux 内核版本号

编译 libpcap

进入 libpcap 文件夹

1
cd /home/jim/mt7620/libpcap

进行编译

1
2
./configure --host=mipsel-linux --prefix=/home/jim/mt7620/ --with-pcap=linux
make

请不要直接复制粘贴,需要针对你的实际情况进行修改。

需修改的地方有:

  • --host,对应你的路由器芯片架构进行修改(arm-linuxmipsel-linux
  • --prefix,换成你的路径

./configure 部分不应出错。

make 部分,只要看到 ranlib libpcap.a 没有出错即可,不用理会 libpcap.so 是否出错。

完成后请查看你的 libpcap 目录下是否生成 libpcap.a

编译 MentoHUST

进入 MentoHUST 目录,生成 Makefile:

1
2
cd /home/jim/mt7620/mentohust
sh autogen.sh

获取自己所在平台:

1
./config.guess

输出的信息替换到下方代码的 --build 中,然后执行命令进行编译:

1
2
./configure --build=x86_64-pc-linux-gnu --host=mipsel-linux   --disable-encodepass --disable-notify --with-pcap=/home/jim/mt7620/libpcap/libpcap.a
make

其中 --with-pca 后内容请修改为自己的对应路径

如果运行无误,完成后就可以在 /home/jim/mt7620/mentohust/src 中获取所需要的 mentohust 文件了,教程结束。

参考文章