Armadilloフォーラム

クロスコンパイルした実行ファイルをArmadilloで実行できない

s12345678

2023年4月17日 10時56分

お世話になっております。

●内容
ATDE上でコンパイルしたプログラムをArmadillo-IoT G4で実行したいと考えています。

「Hello World!」を出力するだけのプログラムhello.cを作成し,コンソール上にて次のコマンド
[ATDE ~]$ aarch64-linux-gnu-gcc hello.c -o hello
を実行すると実行ファイルhelloが作成されるのですが,

それをwgetコマンドでArmadillo IoT G4へ転送し,実行権限を付与した後,次のコマンド
[armadillo ~]# ./hello
を実行すると次のエラーが発生し実行できないといった状況です。
「-ash: sudo: not found」

Armadillo-IoT G4側の設定,ATDE側の設定,コンパイルコマンド等で問題が考えられますでしょうか。

●確認したこと
・aarch64-linux-gnu-gccコマンドで作成した実行ファイルをATDE上で実行すると「Hello World!」の文字列が出力されます。
・ATDE上でファイルコマンドにて,作成した実行ファイルのファイル形式を確認すると,次のようになっております。
「hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=81c95023e1dc6b602eeec0e998198770ec80d051, for GNU/Linux 3.7.0, not stripped」
・ATDEのバージョンは「ATDE9 v20221024」です。

よろしくお願いいたします。

ファイル ファイルの説明
hello.c コンパイル対象のソースファイル
コメント

at_dominique.m…

2023年4月17日 11時54分

s12345678さん

マルティネです。

> [armadillo ~]# ./hello
> を実行すると次のエラーが発生し実行できないといった状況です。
> 「-ash: sudo: not found」

「./hello: not found」ですね。
ATDE は debian の aarch64-linux-gnu-gcc で、 glibc を使うプログラムを生成します (「gnu」の部分は gnu libc の意味です)。

Armadillo で使われている Armadillo Base OS は alpineベースで musl という libc を使っていますので、glibc のバイナリは実行できません:
/lib/ld-linux-aarch64.so.1」の dynamic interpreter は存在しないため、実行が ENOENT (そのようなファイルやディレクトリはありません)で失敗して上記のエラーが出力されます。

解決方法がいくつかあります:

- ATDE と同じ debian バージョンをコンテナで実行すればバイナリを問題なく実行できると思います。
G4 の製品マニュアルでは 「Armadillo-IoT ゲートウェイ G4 コンテナ 」 ページ ( https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4… ) の at-debian-image を使っていますが、NXP 独自のハードウェアに依存が無ければ普通の docker.io/debian:bullseye コンテナでも実行できます。
hello の場合は別の glibc を使っているコンテナでも実行できると思いますが、他のライブラリの依存ができると同じ OS を使った方が安全です。
Armadillo Base OS はコンテナで使う前提で提供していますので、この方法を推奨します。
コンテナの運用など特集で申し訳ございませんが、製品マニュアルの「9.5. コンテナの運用」( https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro… )と当サイトのブログ(「Armadillo Base OS:コンテナでの開発を簡単にする方法 」 https://armadillo.atmark-techno.com/blog/15349/11535 等)をご参照ください。

- ATDE でビルドした物を alpine で実行したい場合(Armadillo Base OS 直接か alpine のコンテナ)は少し難しいです。
ATDE で podman を使って docker.io/arm64v8/alpine のコンテナで(クロスではなくエミュレーション)のビルドもできますし、alpine の chroot を作って muslベースの cross toolchain をインストールしてクロスでビルドもできますが、数行で簡単に説明できませんのでどうしても必要でしたら聞いてください。

何か分からないところがあったら聞いてください。

よろしくお願いします。

at-debian-imageのコンテナ内で、バイナリを実行することができました。
ご回答に感謝します。