👋

並行プログラミング6章の実行環境

2022/01/14に公開

著者の方の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