最終更新: 2021-03-24
本記事では、Windows 10 の WSL にインストールされた Ubuntu-20.04 で、 ARM プロセッサ用のクロスコンパイラの導入と動作確認方法を紹介します。元々、この Ubuntu には 3種類の ARM クロスコンパイラ環境の標準パッケージが用意されて居ますので、これを利用します。このクロスビルド環境は、Linaro 等の Debian 系 Linux カーネルのビルドに最適です。
尚、このコンパイラを使ったベアメタル環境用のビルド手順に関しては【こちらの別記事】に記載しています。
目次:
前提条件:
インストール可能か確認:
WSL 上の Ubuntu-20.04 を立ち上げ、下記コマンドで ARM 用のクロスコンパイラ3種が標準パッケージとして利用可能な事を確認します。
sudo apt update
apt list crossbuild-essential-arm*
リストされる3種のパッケージの違いは次の通りです。
- crossbuild-essential-arm64: 64ビットの ARM アーキテクチャ用
- crossbuild-essential-armel: 32ビットの Little Endian 用 (浮動小数点無し)
- crossbuild-essential-armhf: ハードウェア浮動小数点 VFP 搭載 (Hard Float) 32ビット用
尚、それぞれは AArch64、EABI、EABIHF と呼ばれる事も有ります。もっとも、EABI はELF Application Binary Interface の略で、ARM アーキテクチャに限らない一般の用語なので、かなり雑な呼び方では有ります。更に言うと、ELF は Executable and Linkable Format という UNIX System-V Release 4 (SVR4) で導入された実行用バイナリ ファイルの汎用的な形式です。
インストール:
ここでは、ハードウェア浮動小数点ユニット VFP 搭載32ビット用の armhf 版をインストールする事にします。ARM Cortex-A9 コア等に対応したコンパイラとなります。ZEDBoard や Xilinx ZC702 評価ボード用の Linaro Linux のカーネルや、Raspberry Pi 用の Linux のビルドが WSL 上で出来る様になります。
【広告】
インストールには、下記コマンドを実行します。インストールされる GCC のターゲットは「arm-linux-gnueabihf」です。また、「/usr/arm-linux-gnueabihf/」と「/usr/arm-linux-gnueabi/」に Linux の /usr/lib に相当する各種ライブラリがインストールされます。
sudo apt install crossbuild-essential-armhf
インストールしたコンパイラの正常動作の確認:
バージョン表示が正常に行われるか、下記のコマンドで確認します。
arm-linux-gnueabihf-gcc --version
簡単なプログラムをコンパイルしてみます。プログラムには次のソースを利用します。次の cat コマンドから ! までを WSL のターミナル上にカット&ペーストすると、main.c というファイルが出来ます。
cat <<! > main.c
int main() {
volatile int a, b;
int c;
a=3;
b=4;
c=a+b;
return c;
}
!
このソースをコンパイルします。コンパイル時に「-g」と「-gdwarf-2」を同時に指定します。これは、ICE (In-Circuit Emulator) 等で使用される標準的なデバッグ情報 DWARF バージョン2 を出力されるバイナリに付加する為です。コンパイル内容の詳細に関しては【こちらの別記事】のベアメタル用のビルド手順の中で解説しています。
コンパイル後に、file コマンドで ARM用 の 32 ビット ELF フォーマットで、EABI (Embedded Application Binary Interface) 、ターゲットが linux-armhf である事を確認します。
また、ARM 用の objdump を使って、出力された DWARF のバージョンが 2 である事と、ディスアセンブルして ARM のアセンブラ ソースコードを確認します。objdump に指定する「--dwarf=info」は DWARF の情報を表示すること、「--disassemble=main」は main() 関数のみを抜き出すこと、「--source」は、ディスアセンブルしたコードの中に、コンパイルしたC のソースコードを挿入する事を意味します。
arm-linux-gnueabihf-gcc main.c -g -gdwarf-2 -marm -Og -o main.out
file main.out
arm-linux-gnueabihf-objdump main.out --dwarf=info | head
arm-linux-gnueabihf-objdump main.out --disassemble=main --source --section=.text
画像はクリックまたはスワイプすると拡大します。
更なる確認予定 (今後の記事の予定):
Ubuntu-20.04 の標準パッケージである、QEMU (qemu-system-arm) とGDB (gdb-multiarch) を使用して、Linux 用のオブジェクトとしてシミュレーションとデバッグが出来る筈なのですが、一寸頓挫しています。qemu-system-arm には、ZEDBoard、Xilinx 社製 ZC702 評価ボード、ADI 社製 SDR 学習キット ADALM-Pluto 等に搭載されている Cortex-A9 コア搭載の Xilinx 社製 FPGA内蔵 Zynq SoC (xilinx-zynq-a9) や、Raspberry Pi 2 (raspi2) 用のシミュレーション モデルも入って居ます。
尚、Raspberry Pi 2 は既に古い製品なので、今から購入するのであれば、「Raspberry Pi 3 Model B+ (Pi3B+) 技適付き」をお薦めします。「技適マーク付き」でないと日本国内でワイヤレス LAN の使用が違法となります。また、Pi4B は更に新しいのですが、消費電力が若干多く、5.1V 3A 出力、USB Type-C の特殊な AC アダプタが必要となります。AC アダプタは PSE 取得品でないと、これも国内での使用が違法となります。
【広告】
また、Insight (GDBtk) を WSL 上にビルドして、ベアメタル (OS無しの状態) での GUI デバッグも可能ですが、こちらも途中まで出来て居ますので、順次記事にして行きます。