👋
並行プログラミング6章の実行環境
著者の方のGitHubで次のような記述がありました。
AArch64環境のみ実行可能です
悲しかったのでx86環境でQUMEを使って実行できるようにしました
x86用のコードもありました
前提
- QUMEがインストールされていること
- ARMのクロスコンパイル環境が構築されていること
参考に私が使っているDockerfileの該当部分を載せておきます
# ARM用の環境を構築
RUN apt-get update && apt-get install -y qemu-user-static gcc-aarch64-linux-gnu
RUN apt-get update && apt-get install -y gcc-multilib libstdc++-9-dev-arm64-cross
RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
実行方法
# ARM用の環境をインストール
# rustup target listでリストが確認できる
rustup target add aarch64-unknown-linux-gnu
[プロジェクトルート]/.cargo/config
を作成して以下を記述
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
runner = "qemu-aarch64-static"
builder.rsで記述されている使用するコンパイラを変更
use std::process::Command;
// 一緒にビルドするオブジェクトファイル一覧
const ASM_FILE: &str = "asm/context.S";
const O_FILE: &str = "asm/context.o";
const LIB_FILE: &str = "asm/libcontext.a";
fn main() {
// C言語ファイルのコンパイルコマンド
Command::new("aarch64-linux-gnu-gcc")
.args(&[ASM_FILE, "-c", "-fPIC", "-o"])
.arg(O_FILE)
.status()
.unwrap();
// ライブラリ作成用のコマンド
Command::new("aarch64-linux-gnu-ar")
.args(&["crus", LIB_FILE, O_FILE])
.status()
.unwrap();
println!("cargo:rustc-link-search=native={}", "asm"); // asm をライブラリ検索パスに追加
println!("cargo:rustc-link-lib=static=context"); // libcontext.a という静的ライブラリをリンク
println!("cargo:rerun-if-changed=asm/context.S"); // asm/context.S というファイルに依存
}
最後にターゲットを指定してビルド
# ライブラリパスを通す
export QEMU_LD_PREFIX=/usr/aarch64-linux-gnu/
# 実行する
cargo run --target aarch64-unknown-linux-gnu
Discussion