2025 年 06 月 13 日
第 8 話:SDK でビルドしたプログラムを EMLinux で動かしてみよう
はじめに
前回の記事 第 7 話:組込み Linux「EMLinux」の SDK をビルドしてみよう では、コンテナ版 SDK ( 以降、SDK) で、ARM64 版のプログラムをビルドできることを確認しました。
本記事では、実際に ARM64 版のサンプルプログラムを SDK にてビルドし、ビルド生成物を EMLinux で動かしてみたいと思います。
ソースコードの準備
SDK でビルド対象となるソースコードを準備します。
ユーザ emlinux のホームディレクトリ (/home/emlinux) 配下に、sdkuser/sample ディレクトリを作成していきます。
$ mkdir -p /home/emlinux/sdkuser/sample
touch コマンドで sample.c ファイルを作成します。
$ touch /home/emlinux/sdkuser/sample/sample.c
テキストエディタで sample.c を開き、以下のように編集します。
#include <stdio.h>int main(int argc, char** argv) { printf("Hello, EMLinux.\n"); return 0; }
SDK でのビルド
前回の記事を参考に SDK をビルドしてください。SDK のビルド後、ビルド生成物が保存されているディレクトリに移動します。本記事では EMLinux 3.3-2025 を使用しました。
$ cd /home/emlinux/EMLinux_3.3-202505/source/emlinux-3.3-202505/build/tmp/deploy/images/qemu-arm64/emlinux-image-base-sdk-docker-archive/
以下のコマンドを実行し、コンテナにログインします。
$ docker compose run --rm emlinux3-sdk
コンテナにログイン後、sample.c が保存されているディレクトリに移動します。
sdkuser@b91ffa6a8e57:~$ cd /host-home/sdkuser/sample/
sample.c があることを確認できます。また、cat コマンドで sample.c の内容を確認してみます。ホストのファイルが参照できていることがわかります。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ ls -lh total 4.0K -rw-rw-r-- 1 sdkuser sdkuser 104 May 28 22:09 sample.c sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ cat sample.c #include <stdio.h>int main(int argc, char** argv) { printf("Hello, EMLinux.\n"); return 0; }
以下のコマンドを実行し、ソースコードをビルドしてください。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ ${CC} sample.c -o sample
なお、${CC} は、以下のように定義されています。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ export | grep CC declare -x CC="/usr/bin/aarch64-linux-gnu-gcc -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security"
コンテナの環境ではログインした段階でターゲット向けのビルド環境になっています。そのため、ビルド生成物が ARM64 版のバイナリファイルができあがります。確認してみます。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ file sample sample: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=255324731d5e27cd528b78cff7493262de3bf4c0, for GNU/Linux 3.7.0, not stripped
また、sample を実行し、「Hello, EMLinux.」が表示されることを確認してください。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ ./sample Hello, EMLinux.
確認後、コンテナからログアウトしてください。
sdkuser@b91ffa6a8e57:/host-home/sdkuser/sample$ exit
カスタムレイヤーの作成
ここまでで開発したプログラムが無事にビルドできることが確認できました。次に、レシピを書いて EMLinux に組み込んでみます。今回は、既にビルドした実行ファイルをそのまま取りこんでみたいと思います。
まず、第 3 話:組込み Linux「EMLinux」をカスタマイズしてみようと同様に、カスタムレイヤーを作成していきます。
EMLinux を展開したディレクトリに移動してください。本記事では以下のディレクトリに展開しました。
cd /home/emlinux/EMLinux_3.3-202505/source/emlinux-3.3-202505/
以下のコマンドを実行し、meta-custom ディレクトリを作成してください。
./repos/meta-emlinux-private/scripts/create-custom-layer -p 30 custom
meta-custom ディレクトリを repos ディレクトリ配下に移動してください。
mv templates/meta-custom/ repos/
以下のコマンドを実行し、setup-hooks ディレクトリ配下にリンクファイル 70-add-layer-custom を作成してください。
ln -s ../repos/meta-custom/scripts/add-layer-custom setup-hooks/70-add-layer-custom
repos ディレクトリに移動してください。
cd repos/
meta-custom ディレクトリが追加されていることを確認してください。
$ ls -lh total 32K drwxr-xr-x 10 emlinux emlinux 4.0K May 9 08:42 isar drwxr-xr-x 16 emlinux emlinux 4.0K May 9 08:42 isar-cip-core drwxr-xr-x 6 emlinux emlinux 4.0K May 29 04:49 meta-custom drwxr-xr-x 14 emlinux emlinux 4.0K May 9 08:42 meta-emlinux drwxr-xr-x 15 emlinux emlinux 4.0K May 9 08:42 meta-emlinux-ext-imx drwxr-xr-x 8 emlinux emlinux 4.0K May 9 08:42 meta-emlinux-ext-mpsoc drwxr-xr-x 11 emlinux emlinux 4.0K May 9 08:42 meta-emlinux-ext-qoriq drwxr-xr-x 6 emlinux emlinux 4.0K May 9 08:42 meta-emlinux-private
tree コマンドで meta-custom ディレクトリ配下の構成を確認してください。
$ tree meta-custom/ meta-custom/ ├── conf │ └── layer.conf ├── COPYING.MIT ├── README ├── recipes-core │ └── images │ └── custom-image.bb ├── recipes-example │ └── sample │ ├── files │ │ └── README │ └── sample_0.1.bb └── scripts └── add-layer-custom 7 directories, 7 files
テキストエディタで meta-custom/recipes-core/images/custom-image.bb を開き、以下のように編集してください。
(前略) # # Install recipes or self-build packages # IMAGE_INSTALL:append = " \ sample \ " (後略)
ビルドしたバイナリファイル sample を meta-custom/recipes-example/sample/files に移動してください。
cp ~/sdkuser/sample/sample ./meta-custom/recipes-example/sample/files/
なお、README ファイルは本記事では不要のため削除しても問題ありません。
rm ./meta-custom/recipes-example/sample/files/README
テキストエディタで meta-custom/recipes-example/sample/sample_0.1.bb を開き、以下のように編集してください。
DESCRIPTION = "Sample application" MAINTAINER = "NAME" DEBIAN_DEPENDS = "apt" inherit dpkg-raw SRC_URI = "file://sample" do_install() { install -d ${D}/usr/bin/ install -m 644 ${WORKDIR}/sample ${D}/usr/bin/ }
EMLinux のビルド
meta-emlinux/docker ディレクトリに移動してください。
cd ./meta-emlinux/docker/
以下のコマンドを実行し、ビルド用のコンテナを起動してください。
./run.sh
ビルド環境のセットアップ用シェルスクリプトを実行してください。
source setup-emlinux build
meta-custom が追加されていることを確認してください。
build@4a356a107652:~/work/build$ bitbake-layers show-layers NOTE: Starting bitbake server... layer path priority ======================================================================================================== core /home/build/work/build/../repos/isar/meta 5 emlinux-private /home/build/work/build/../repos/meta-emlinux-private 13 emlinux /home/build/work/build/../repos/meta-emlinux 12 cip-core /home/build/work/build/../repos/isar-cip-core 6 custom /home/build/work/build/../repos/meta-custom 30
QEMU 用の EMLinux のイメージをビルドするために、MACHINE 変数に qemu-arm64 を設定してください。
echo 'MACHINE = "qemu-arm64"' >> conf/local.conf
EMLinux をビルドしてください。
bitbake custom-image
ビルド完了後、コンテナからログアウトしてください。
exit
QEMU で EMLinux を起動する
build ディレクトリに移動してください。
cd /home/emlinux/EMLinux_3.3-202505/source/emlinux-3.3-202505/build
touch コマンドで run-vm.sh ファイルを作成してください。
touch run-vm.sh
テキストエディタで run-vm.sh を開き、以下のように編集してください。
path=./tmp/deploy/images/qemu-arm64 image=custom-image-emlinux-bookworm-qemu-arm64 qemu-system-aarch64 \ -device virtio-net-device,netdev=net0,mac=52:54:00:12:35:02 \ -netdev user,id=net0 \ -drive id=disk0,file=$path/$image.ext4,if=none,format=raw \ -device virtio-blk-device,drive=disk0 \ -device qemu-xhci \ -device usb-tablet \ -device usb-kbd \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-pci,rng=rng0 \ -nographic \ -machine virt \ -cpu cortex-a57 \ -m 4096 \ -serial mon:stdio \ -serial null \ -kernel $path/$image-vmlinux \ -initrd $path/$image-initrd.img \ -append 'root=/dev/vda rw highres=off console=ttyS0 mem=4096M ip=dhcp console=ttyAMA0'
run-vm.sh ファイルに実行権限を付与してください。
chmod +x run-vm.sh
run-vm.sh を実行し、QEMU で EMLinux を起動してください。起動完了後、ユーザ名 root、パスワード root でログインしてください。
$ ./run-vm.sh (中略) EMLinux 3.3 EMLinux3 ttyAMA0 EMLinux3 login:
which コマンドで sample が /usr/bin 配下にインストールされていることを確認してください。
root@EMLinux3:~# which sample /usr/bin/sample
sample を実行してみましょう。「Hello, EMLinux.」と無事に表示されました。
root@EMLinux3:~# sample Hello, EMLinux.
さいごに
本記事ではサンプルプログラムを SDK にてビルドしてみました。また、サンプルプログラムをレシピにして QEMU にて動かしてみました。
本記事では一般的な hello world プログラムをビルドしてみましたが、ユーザーランドで動作するアプリケーションだけでなく、デバイスドライバなどをビルドすることも可能です。
EMLinux へのアプリケーションの組込み方やデバイスドライバの開発でお困りの場合には、お気軽にサイバートラストにお問い合わせください。