arm 64bit 環境で、arm 32bit バイナリをクロスビルドする


はじめに

いろんな組み込み用SBC
を使おうとすると現在は、大部分が64ビット環境のOSとなります。
一方、RaspberryPIのOSで一番よくつかわれる環境は32ビット環境となり、RaspberryPI上の資産を別のSBCに持っていくときの障害の一つとなります。
INTEL環境の場合、gccに-m32 オプションをつけることで、64ビットOS上で32ビットのコードをコンパイルできますがARM環境の場合には、基本的にはビルド環境についてはクロスコンパイル環境として構築する必要があります。
ARMv7(32ビット)のクロス環境をARMv8(64bit)上で作る例があまりなかったので、書き留めておきます。
ARM環境上では、ARMv7 (32bit)のコードを ARMv8(64bit)OS上で実行するには、ライブラリのインストールだけで実行が可能となりますが、コンパイラについては、基本的には別のコンパイラのインストールが必要となります。

やったこと

ARMv8 環境上で、32bitの実行が可能なようにライブラリのインストール
32bit用のGCC,G++をインストール
32bit用のライブラリのインストール
コンパイル


JETSONだと、ちゃんと調べてませんが、32ビットコードはそのまま実行できますが、
apt install xxxxx:armhf
でリポジトリがたりないんだかなんだかわかりませんが怒られます。
まあ外部ライブラリを使ってまでJetsonで32ビットコードをビルドすることは今のところ私はないので、放置ということで。。
JETSONだと32ビットの実行環境ははいってますが、add architecture されていないようなので、Nvidia関連がarmhfをサポートしていないと怒られますが以下で同様に動くはずです。

sudo dpkg --add-architecture armhf
sudo apt update

32bit実行環境の構築

アーキテクチャ追加
sudo dpkg --add-architecture armhf
追加後のアップデート
sudo apt update
32ビット環境用の標準ライブラリのいンストール
sudo apt install libc6:armhf libstdc++6:armhf
リンク追加
cd /lib
sudo ln -s arm-linux-gnueabihf/ld-2.23.so ld-linux.so.3

32ビットクロスコンパイラのインストール

GCC
sudo apt install gcc-arm-none-eabi
G++
sudo apt install g++-arm-none-eabi
sudo apt install g++-arm-linux-gnueabihf

32ビット外部ライブラリのインストール

標準ライブラリのみの場合には必要ありませんが、ビルドにあたって、外部のライブラリが必要な場合には、
:armhf
を末尾に追加して、ライブラリをインストールしておく必要があります。
たとえば、libasound2だと
開発時のライブラリ
sudo apt install libasound2-dev:armhf
実行時のみ
sudo apt install libasound2:armhf
が必要となります。

コンパイル

MAKE内の
GCCのかわりに
arm-linux-gnueabihf-gcc
G++のかわりに
arm-linux-gnueabihf-g++
を実行します。

Executableの実行

シームレスに実行するだけです。