Raspberry Piの実行ファイルをWSL上でクロスコンパイル


さて今回も地道に写経だ。

前回までカーネルのクロスコンパイルをやったのだが、今回は実行ファイルのビルドだ。
これができれば自作のアプリやドライバなどをクロスコンパイルできるようになる。
今回は定番の"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に実行ファイルがコピーされた。
コピーパスは自分の環境で適宜変更のこと。

実行

Raspberry Piにログインして、コピーしたパスから

./helloworld

面倒ならSSHで実行してしまえばよい。