さて今回も地道に写経だ。
前回までカーネルのクロスコンパイルをやったのだが、今回は実行ファイルのビルドだ。
これができれば自作のアプリやドライバなどをクロスコンパイルできるようになる。
今回は定番の"Hello World"をARM 32bit版でクロスコンパイルする。
手順としては、
だ。
ツールチェーンの導入
まずはこちらに行ってみよう。
github.com
これを何と読む。
These toolchains are deprecated. They are outdated and easily available from other sources (e.g. direct from Ubuntu apt).
Raspberry Piはエコシステムがかなり進化している。
古い記事を読むとかなり面倒なツールチェーンの導入方法や、ビルド環境設定が書かれているが、今(2023年9月現在)ではかなり簡素化されている。
つまるところ、WSL上で
sudo apt-get install gcc-arm-linux-gnueabihf
で終わりなのだ。
しかも前回までのカーネルのクロスコンパイル環境をすでに構築している場合には、このaptはすでに入っているのだ。
実質何もしないでよろしい。
ソースコード、Makefileの作成
ソースコード(helloworld.c)はこんな。
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello Aho\n"); return 0; }
Makefileはこんな。
CC = arm-linux-gnueabihf-gcc helloworld: helloworld.o $(CC) helloworld.o -o helloworld helloworld.o: helloworld.c $(CC) -c helloworld.c clean: rm *.o helloworld
見ての通りキーになるのはコンパイラの指定で、
がすでに上記のツールチェーンで導入されているのだ。
昔は"gcc (うんにゃらかんにゃらうんにゃらかんにゃら)"とARMのクロスコンパイルは長い呪文を書いたのだが、専用バイナリにしたのね。
ちなみに実体は2023年9月現在では”/usr/bin/arm-linux-gnueabihf-gcc-9"だ。
ビルド
make
"helloworld"ができているはず、ARMバイナリーかどうか確認してみよう。
file helloworld
とすれば
helloworld: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=(SHA1ハッシュコード), for GNU/Linux 3.2.0, not stripped
と表示されるはず。
実行ファイルのコピー
scp helloworld nsuzuki@macrpi:/home/nsuzuki/work
これでRaspberyy Piの/home/nsuzuki/workに実行ファイルがコピーされた。
コピーパスは自分の環境で適宜変更のこと。