以前に、rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順 という記事を書きました。
今回はrustcを直接実行するのでなくてcargoを使ってクロスビルドします。
準備
rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順 の記事に従ってrust のtargetを追加します。今回はaarch64-unknown-linux-gnu。
rustup target add aarch64-unknown-linux-gnu
cargoの設定
~/.cargo/config
に[target.aarch64-unknown-linux-gnu]
の項目を追加してlinkerを指定します。今回はbuildrootでrootfsを作ったのでそのツールチェインのgccを指定します。このコマンドが実行できるように、必要に応じて環境変数PATHも変更しておきます。
#[build]
#target="aarch64-unknown-linux-gnu"
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-buildroot-linux-gnu-gcc"
なお、[build]
の項目を書いておくとcargoのデフォルトのtargetを変更できます。
今回はデフォルトはネイティブのx86_64のままにしておいて、cargoコマンドの引数でtargetを指定するようにします。このほうがネイティブビルドとクロスビルドの使い分けが簡単なので。(なので、[build]
の項目はコメントアウト)
クロスのcargoコマンドを実行するshellスクリプト
前回の記事で作ったnet_activity
コマンドをこのスクリプトでarm64向けにクロスビルドします。
リリース用にビルドしてシンボル情報をstripするようにしました。
#!/bin/sh
TARGET=net_activity
STRIP=aarch64-buildroot-linux-gnu-strip
export PKG_CONFIG_ALLOW_CROSS=1
cargo build --target aarch64-unknown-linux-gnu --release
cd target/aarch64-unknown-linux-gnu/release/
cp $TARGET ${TARGET}_g
$STRIP $TARGET
これを実行してできたファイルが以下。シンボル情報がかなり大きいようで、stripすることでずっとサイズが小さくなります。
$ file target/aarch64-unknown-linux-gnu/release/net_activity{,_g}
target/aarch64-unknown-linux-gnu/release/net_activity: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 4.9.0, stripped
target/aarch64-unknown-linux-gnu/release/net_activity_g: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 4.9.0, with debug_info, not stripped
$ ls -lh target/aarch64-unknown-linux-gnu/release/net_activity{,_g}
-rwxr-xr-x 2 koba koba 323K 9月 25 13:43 target/aarch64-unknown-linux-gnu/release/net_activity
-rwxr-xr-x 1 koba koba 3.0M 9月 25 13:43 target/aarch64-unknown-linux-gnu/release/net_activity_g
このコマンドはarm64 linuxの上で問題なく動作しました。
なお、以下のように普通にcargoコマンドを実行すると、ネイティブ環境向けにビルドされますので、手元で動かしてみることができます。
$ cargo build
$ file target/debug/net_activity
target/debug/net_activity: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cdb33e921d9fcd59ebc06a9997869fd30c0aa6d2, with debug_info, not stripped
$ ls -lh target/debug/net_activity
-rwxr-xr-x 2 koba koba 6.1M 9月 25 18:48 target/debug/net_activity