お手軽に arm64 クロスビルド環境を作る

引きつづきラズベリーパイの ROS2 環境をいじっているんですが、ふと ROS2 用のコードをビルドするだけなら何も Docker や Podman、QEMU で OS 動かしたりする必要ねんじゃね?と思い PC 側でクロスビルド環境を作ってみた。

$ sudo apt install crosbuild-essential-arm64
$ sudo libc6-dev-arm64-cross

もしかすると、libc6-dev-arm64-cross はいらないかもしれない。

インストールすると /usr/aarch64-linux-gnu/ にライブラリやヘッダーファイルなどが保存される

試しにソースをビルドしてみます。

#include <stdio.h>

int main(int, char**)
{
   printf("hello- arm!!\n");
   return 0;
 }

clang でビルドしてみる

$ clang --target=aarch64-linux-gnu hello.c

a.out が出来るので確認してみる

$ file a.out
a.out: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=af0df26fcefe0b9815d6892dd721439aaf1759e6, for GNU/Linux 3.7.0, not stripped

ちゃんと aarch64 になってる。

普通に実行すると怒られる
$ a.out
aarch64-binfmt-P: Could not open '/lib/ld-linux-aarch64.so.1': No such file or directory

実行する。

$ sudo apt install qemu-user
$  qemu-aarch64  -L /usr/aarch64-linux-gnu/ ./a.out 
hello- arm!!

または、QEMU_LD_PREFIX 環境変数を設定して実行
$ QEMU_LD_PREIX=/usr/aarch64-linux-gnu ./a.out

もしかすると qemu-user-static パッケージも必要かもしれない。そのへんは適宜インストールすること。

Arm 用の ROS2 環境を /usr /aarch64-linux-gnu に展開する方法はまた考えよう。

参考

clang + cmake で aarch64 linux 向けに C/C++ アプリをクロスコンパイルするメモ #CMake – Qiita

QEMU でARM エミュレータ環境を作成する #ARM – Qiita