お手軽に 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