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の実行
シームレスに実行するだけです。
Author And Source
この問題について(arm 64bit 環境で、arm 32bit バイナリをクロスビルドする), 我々は、より多くの情報をここで見つけました https://qiita.com/sowd0726/items/9d80804d3fbfd6efa609著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .