1.3 クロス開発環境の作成 #
エッジゲートウェイのアプリケーションをクロス開発環境で開発する方法について説明します。
1.3.1 PC環境の準備 #
aptパッケージのインストール
PC側のUbuntu環境で、aptパッケージリストの更新とアップグレードをして、以下のaptパッケージをインストールしてください。
実行環境: ホストマシン(PC)
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential crossbuild-essential-arm64 device-tree-compiler libssl-dev gcc-arm-linux-gnueabi file tree
補足: 本節のサンプルのビルドに必要なのは、build-essential、crossbuild-essential-arm64、file、tree です。device-tree-compiler と libssl-dev は、『3.11 Linuxカーネルのビルド方法』でカーネルをビルドする場合に使います。
ツールチェインのバージョン確認
ツールチェインのバージョンを確認してください。
実行環境: ホストマシン(PC)
$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
補足: 実行例は Ubuntu 18.04 LTS の出力です。Ubuntu 24.04 LTS では gcc 13 系の版が表示されます(『1.1.2 ソフトウェア仕様』の開発ツールチェイン)。ツールチェインのバージョンは、ユーザー環境のアップデートに伴って更新される可能性があります。
ツールチェインコマンド一覧
| aptパッケージ | コマンド |
|---|---|
| binutils-aarch64-linux-gnu | aarch64-linux-gnu-addr2line |
| aarch64-linux-gnu-ar | |
| aarch64-linux-gnu-as | |
| aarch64-linux-gnu-c++filt | |
| aarch64-linux-gnu-dwp | |
| aarch64-linux-gnu-elfedit | |
| aarch64-linux-gnu-gprof | |
| aarch64-linux-gnu-ld | |
| aarch64-linux-gnu-ld.bfd | |
| aarch64-linux-gnu-ld.gold | |
| aarch64-linux-gnu-nm | |
| aarch64-linux-gnu-objcopy | |
| aarch64-linux-gnu-objdump | |
| aarch64-linux-gnu-ranlib | |
| aarch64-linux-gnu-readelf | |
| aarch64-linux-gnu-size | |
| aarch64-linux-gnu-strings | |
| aarch64-linux-gnu-strip | |
| cpp-aarch64-linux-gnu | aarch64-linux-gnu-cpp |
| g++-aarch64-linux-gnu | aarch64-linux-gnu-g++ |
| gcc-aarch64-linux-gnu | aarch64-linux-gnu-gcc |
| aarch64-linux-gnu-gcc-ar | |
| aarch64-linux-gnu-gcc-nm | |
| aarch64-linux-gnu-gcc-ranlib | |
| aarch64-linux-gnu-gcov | |
| aarch64-linux-gnu-gcov-dump | |
| aarch64-linux-gnu-gcov-tool |
1.3.2 クロスビルドの実行 #
サンプルコードを用いてクロスビルドを実行する手順について説明します。
サンプルコード(main.c、Makefile)の作成
以下に示すのは、10秒ごとに文字列を出力し続けるプログラムのソースコードです。
main.c
実行環境: ホストマシン(PC)
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while(1){
printf("Hello World!\n");
sleep(10);
}
}
Makefile
CC = aarch64-linux-gnu-gcc
STRIP = aarch64-linux-gnu-strip
CFLAGS = -O3 -Wall
DESTDIR =
LIBS =
OBJS = main.o
PROG = amnimo-sample-app
all: $(PROG)
$(PROG): $(OBJS)
$(CC) $(OBJS) $(LIBS) -o $(PROG)
clean:
rm -f *.o $(PROG)
install: $(PROG)
install -D -s --strip-program=$(STRIP) $(PROG) $(DESTDIR)/usr/sbin/$(PROG)
補足: クロス開発環境では、
make installでホストマシン(PC)の/usr/sbinにインストールしても意味がありません。installターゲットは、make install DESTDIR=$HOME/stagingのようにステージング用のディレクトリを指定して使います。ストリップには、aarch64 用のaarch64-linux-gnu-stripを使います(ホストマシンのstripは aarch64 の実行ファイルを処理できません)。エッジゲートウェイへは、次の「実行ファイル転送」の手順で転送します。
ディレクトリ構造とファイル配置を以下に示します。
~/sample$ tree
.
├── main.c
└── Makefile
ビルド
実行環境: ホストマシン(PC)
~/sample$ make all
ビルド結果の実行ファイルの種別の確認
実行環境: ホストマシン(PC)
~/sample$ file amnimo-sample-app
amnimo-sample-app: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=1e9a9503efe79366a8c4f51bba5d20cc65f9a7fe, not stripped
実行ファイル転送
生成された実行ファイルamnimo-sample-appを、scpでエッジゲートウェイに送信します。
実行環境: ホストマシン(PC)
~/sample$ scp amnimo-sample-app admin@192.168.0.254:/tmp/
The authenticity of host '192.168.0.254 (192.168.0.254)' can't be established.
ECDSA key fingerprint is SHA256:AJ0j48/CzTC8mETZnRjwHyGegbpq00vQOg6/8sB9npg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.254' (ECDSA) to the list of known hosts.
admin@192.168.0.254's password:
amnimo-sample-app 100% 9080 3.0MB/s 00:00
補足: fingerprint の確認(
The authenticity of hostからWarning: Permanently addedまでの行)は、以下の場合に出力されます。
- 初回のsshログイン時
- 初回のscpによるデータ送受信時
実行ファイルの実行
エッジゲートウェイにログインし、実行ファイルを実行します。
実行環境: エッジゲートウェイ
admin@amnimo:~$ /tmp/amnimo-sample-app
Hello World!
Hello World!
…

補足: 本節のサンプルのビルドに必要なのは、build-essential、crossbuild-essential-arm64、file、tree です。device-tree-compiler と libssl-dev は、『