Build IPOP for PandaBoard ES
我想在 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!