我想在 BandaBoard ES 上執行 IPOP 建立 vpn mesh, 但官網沒有 prebuilt binary 可下載, 只好自行 build 過.

首先, 按照這篇 準備好 rootfs.

接著, 切進準備好的 rootfs 中

$ sudo systemd-nspawn -D debian-armhf
Spawning container debian-armhf on debian-armhf.
Press ^] three times within 1s to kill container.
[email protected]:~#

如果希望切進去以後還是用相同的 user 執行的話 (用 root 身份做事不是個好習慣~), systemd-nspawn 命令可改變如下

$ sudo systemd-nspawn -D debian-armhf \
 --bind $HOME \
 --bind-ro /etc/passwd \
 --bind-ro /etc/group \
 --bind-ro /etc/shadow \
 --user $USER

步驟可參考官網 說明, 但有些地方要改一下.

安裝 build-time dependencies 時, 要加裝一個 ninja-build, 所以命令修改如下

$ sudo apt-get update
$ sudo apt-get install --yes ninja-build default-jdk pkg-config git subversion make gcc g++ python libexpat1-dev libgtk2.0-dev libnss3-dev libssl-dev 

Target architecture 的定義要改掉. 官網的指令為

export GYP_DEFINES="$GYP_DEFINES target_arch=ia32"

target_arch 定義在目錄 libjingle/trunk/third_party/libvpx/source/config/linux

$ ls libjingle/trunk/third_party/libvpx/source/config/linux
arm  arm-neon  arm-neon-cpu-detect  generic  ia32  mipsel  x64

我們需要的是 arm-neon, 修改後的命令改為

export GYP_DEFINES="$GYP_DEFINES target_arch=arm-neon"

ninja 命令是在 clone 下來的 source code 中. 但因為我們運行的環境變成了 armhf, 所以照官網的方式執行時會失敗, 所以在安裝相依時我們多裝了 ninja-build. 命令要改一下, 用絕對路徑

$ /usr/bin/ninja -C out/Release ipop-tincan

在 build ipop-tincan 的時候, 會發生以下問題

$ /usr/bin/ninja -C out/Release ipop-tincan
ninja: Entering directory `out/Release'
[785/785] LINK ipop-tincan
FAILED: c++ -Wl,--fatal-warnings -Wl,-z,now -Wl,-z,relro -pthread -Wl,-z,noexecstack -fPIC -Wl,-O1 -Wl,--as-needed -Wl,--gc-sections -o ipop-tincan -Wl,--start-group obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.tincan.o obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.tincanconnectionmanager.o obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.xmppnetwork.o obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.controlleraccess.o obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.tincanxmppsocket.o obj/talk/ipop-project/ipop-tincan/src/ipop-tincan.tincan_utils.o obj/talk/xmpp/ipop-tincan.jingleinfotask.o obj/third_party/openssl/libopenssl.a obj/talk/libjingle_p2p.a obj/third_party/jsoncpp/libjsoncpp.a obj/talk/libipop-tap.a obj/third_party/libsrtp/libsrtp.a obj/talk/libjingle.a  -Wl,--end-group -lcrypto -ldl -lrt -lXext -lX11 -lXcomposite -lXrender -lnss3 -lnssutil3 -lsmime3 -lplds4 -lplc4 -lnspr4 -lexpat
obj/.o: In function `CRYPTO_chacha_20':
chacha_enc.c:(.text.CRYPTO_chacha_20+0x4e8): undefined reference to `CRYPTO_chacha_20_neon'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

CRYPTO_chacha_20_neon 這個 symbol 沒有 build 進去, 將 third_party/openssl/openssl/crypto/chacha/openssl.chacha_enc 中兩處使用到該 function 的地方 comment 掉即可!

最後, 如果執行命令時卡住, 很多時候是牆搞的鬼, 可配合 proxychains 命令翻越.

Good luck!