採用情報

お問い合わせ

BLOG

EMLinux

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 へのアプリケーションの組込み方やデバイスドライバの開発でお困りの場合には、お気軽にサイバートラストにお問い合わせください。

EMLinux無償評価版ダウンロード申し込み

連載リンク
CentOS 7 延長サポートサービス
デジタルトランスフォーメーションのための電子認証基盤 iTrust
iTrust SSL/TLS サーバー証明書
OSZAR »