WSL2 上で直接 ARM64 用のバイナリをコンパイルする方法と、Docker を使用して ARM64 アーキテクチャのコンテナ内でビルドする方法があります。ここでは、Dockerを使った方法を説明します。
WSL Side
Docker イメージを複数のアーキテクチャで動作させるために QEMU を設定します。
docker run —rm —privileged multiarch/qemu–user–static —reset –p yes |
また、arm64v8/ubuntu のイメージをPullしてください。
docker pull arm64v8/ubuntu |
Step1,Create Directory
mkdir testArm64 cd testArm64 nano Dockerfile |
もしnanoがインストールされてない場所は、下記のコマンドで実行してください。
apt install nano |
Step2,Dockerfile
Docker fileを下図のように作成します。
FROM arm64v8/ubuntu # Install necessary packages RUN apt-get update && apt-get install -y \ build-essential \ gcc-aarch64-linux-gnu \ qemu-user-static # Set the default command CMD [“bash”] |
Step3 Build
Dockerに沿ってImageをビルドします。
sudo docker build -t ubuntu-vs2 . |
Step4 Run Container
先ほど作成したImageをContainer立ち上げます。
sudo docker run –p 5000:22 –i -t ubuntu-vs2 /bin/bash |
Step5 Create c program in Docker
Cプログラムを作成します。
mkdir myp cd myp nano myp.c #include <stdio.h> int main(){ printf(“hello from %s!\n”, “ConsoleApplication6”); return 0;} |
Step6 Compile C Program
Cプログラムをコンパイルします。
gcc-13 mpp.c ls a.out mpp.c |
Step7 execute .out file
下記のコマンドでa.outを実行し問題ないかを確認しましょう。
./a.out hello from ConsoleApplication6! |
arm64 Board Side
次はarm64ボード側です。
Step1 transfer the file inside Docker
先ほどWSL 側でコンパイルしたa.outをarm64ボードのContainerに転送します。
sudo docker cp /home/admin/a.out 0f78ef59e89e:/home/ubuntu/ |
Step2 execute .out file
下記のコマンドでa.outを実行し問題ないかを確認しましょう。
chmod +x a.out ./a.out hello from ConsoleApplication6! |
Remark(Ref from ChatGPT)
-y flag
yオプションをつけると、apt-getはすべてのプロンプトに対する答えをyesと仮定できます。通常何かをインストールする場合、適切なパッケージが見つかった後、続行するかどうかを尋ねられます。y をつけると、プロンプトに答える必要がなくなり、インストールが自動的に進みます。
QEMU?
QEMU(Quick Emulator)は、オープンソースのホストマシンエミュレーターおよび仮想化ソフトウェアです。QEMUは多くのプロセッサアーキテクチャ(x86, ARM, PowerPC, SPARCなど)をサポートし、さまざまなオペレーティングシステム(Linux, Windows, BSDなど)をゲストOSとして実行できます。
Docker内でQEMUを使うことは可能で、Dockerはコンテナ技術を利用してアプリケーションの実行環境を提供しますが、QEMUを組み合わせて使用することで、異なるアーキテクチャのアプリケーションをコンテナ内で実行することができます。
異なるCPUアーキテクチャ(例: x86_64上でARMバイナリをビルド)のアプリケーションをビルドやテストするために、QEMUを使用することができます。また、異なるアーキテクチャ向けにコンパイルされたアプリケーションをDockerコンテナ内で実行することができます。
QEMUとDockerの組み合わせは、異なるアーキテクチャ向けのソフトウェアの開発とテストを容易にします。これにより、開発環境の多様性や柔軟性が向上し、クロスプラットフォームのサポートが強化されます。
gcc-aarch64-linux-gnu?
gcc-aarch64-linux-gnuは、GNU Compiler Collection (GCC)のクロスコンパイラの一種で、特にAArch64(64ビットのARMアーキテクチャ)のソフトウェアをコンパイルするために使用されます。これにより、x86_64などの異なるホストアーキテクチャ上で、AArch64向けのバイナリを作成できます。
それにより、異なるアーキテクチャのマシン上でターゲットアーキテクチャ向けにソフトウェアをコンパイルすることができます。例えば、x86_64マシン上でAArch64(ARM64)向けのバイナリをビルドします。
また、組み込みシステム(例:ラズベリーパイなど)向けにソフトウェアを開発する際に便利です。これにより、開発者は強力なデスクトップやサーバーマシンを利用してコードを書き、テストできます。
–privileged?
–privilegedフラグは、Dockerコンテナに特別な特権を付与するオプションです。これにより、通常のコンテナに許可されていないさまざまな操作を行うことができるようになります。このフラグを使用することで、コンテナはホストのハードウェアリソースやデバイスに直接アクセスできるようになります。
」特権付きコンテナは、ホストのデバイスファイルを自由に利用できます。例えば、/dev/sdaや/dev/net/tunのようなデバイスにアクセスできます。
ですが、–privilegedフラグは非常に強力ですが、セキュリティリスクも伴います。特権付きコンテナはホストシステム全体に大きな影響を与える可能性があるため、慎重に使用する必要があります。
multiarch/qemu-user-static
Multiarch(マルチアーチ)は、複数の異なるCPUアーキテクチャをサポートするための仕組みです。これにより、異なるアーキテクチャ用のバイナリを同じシステム上で共存させて実行することができます。なので、multiarch/qemu-user-staticは、QEMUのユーザーモードエミュレータを提供するDockerイメージで、異なるアーキテクチャのバイナリをホスト上で実行できるようにします。このイメージを使うことで、異なるアーキテクチャ(例えば、ARM、PowerPCなど)のバイナリをx86_64マシン上で実行することが可能になります。
Why –privileged?
記事の中の、正式のコマンドは–privileged multiarch/qemu-user-staticです。
QEMUとbinfmt_misc(バイナリインタープリタ)を登録するために、ホストシステムの特定のカーネル機能やリソースにアクセスする必要があるため、–privilegedオプションを使用します。これにより、Dockerコンテナがホストシステムの全てのデバイスやファイルシステムに対して無制限のアクセスを持つことができ、QEMUを使用した異なるアーキテクチャのバイナリの処理が可能になります。
つまり、multiarch/qemu-user-staticのコンテナが自身をbinfmt_miscのために適切に設定できるようにするために、–privilegedオプションが必須となります。
–reset?
こちらはmultiarch/qemu-user-staticイメージのエントリポイントスクリプトに対してのオプションです。このオプションは、QEMUユーザーモードエミュレーションの設定を再初期化するために使用されます。そのオプションは、以下のような役割を持ちます。
- 既存のbinfmt_miscエントリをクリアする。以前に設定されたエミュレータやインタープリタのエントリをリセットします。
- 新しい設定を適用する。最新のQEMUの設定を適用して、クロスプラットフォーム実行環境を再初期化します。
-p yes?
multiarch/qemu-user-static イメージのコンテキストで「yes」が使われる場合、これはその設定過程でインタラクティブなプロンプトを自動的に処理するために利用されることがあります。multiarch/qemu-user-static イメージのコンテキストで「yes」が使われる場合、これはその設定過程でインタラクティブなプロンプトを自動的に処理するために利用されることがあります。
ここでの yes は yes コマンドそのものでなく、エントリーポイントスクリプトのオプションとして機能していることに注意が必要です。
build-essential
build-essentialは、Debian系のLinuxディストリビューション(例えば、Ubuntu)でソフトウェアのコンパイルを行うために必要な基本的なビルドツールを含んだメタパッケージです。これには、以下のようなツールが含まれています:
- gcc(GNU C Compiler)
- g++(GNU C++ Compiler)
- make(ビルドオートメーションツール)
- ライブラリとヘッダーファイル(例えば、libc6-dev、libstdc++)
- その他関連ツール