Dcoker#ARM64でCプログラムの実行環境構築手順

WSL2 上で直接 ARM64 用のバイナリをコンパイルする方法と、Docker を使用して ARM64 アーキテクチャのコンテナ内でビルドする方法があります。ここでは、Dockerを使った方法を説明します。

WSL Side

Docker イメージを複数のアーキテクチャで動作させるために QEMU を設定します。

docker run rm privileged multiarch/qemuuserstatic 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++)
  • その他関連ツール

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする