開発環境の設定とツールチェーン導入
CubieBoard2 の ARM コア向けに Linux カーネルをビルドするには、適切なクロスコンパイラが必要です。まずは開発ホスト上でコンパイライメージを準備します。
# パッケージマネージャ経由でのインストールを試みます
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
# インストールされたか確認(バージョン出力が期待されます)
arm-linux-gnueabihf-gcc --version
パッケージのリポジトリに問題がある場合や特定のバージョンが必要な場合は、独立したバイナリアーカイブのダウンロードも考慮してください。
ソースコードの取得と整理
カーネルソースは git リポジトリから取得するのが推奨されます。ローカルワークディレクトリを設定し、クローンを行います。
# ワークディレクトリの作成
mkdir -p ~/cubieboard2_build
cd ~/cubieboard2_build
# リポジトリの取得
git clone https://github.com/cubieboard2/linux-sunxi.git
cd linux-sunxi
zip アーカイブ形式で配布されている場合、解凍して同じディレクトリ構成になるように配置することも可能です。
カーネルの構築設定
ビルド前にアーキテクチャ指定を行いますが、コマンドラインで直接渡す方法を用います。
# 基本ディフェルトコンフィグの生成
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun7i_defconfig
# 詳細な設定を確認・編集する場合
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
ここで `scripts/basic/fixdep` などのビルドエラーが発生する場合は、ホスト環境のビルドツールセットが不足している可能性があります。以下のパッケージを追加します。
sudo apt install build-essential
実質的なビルド処理
設定完了後、マルチコア CPU の性能を利用するために並列化オプションを付与して画像ファイルを生成します。
# ジョブ数をシステムプロセッサ数に合わせて自動化
JOBS=$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$JOBS uImage modules dtbs
頻出するコンパイル不具合の対策
古いカーネルソースと新しいコンパイラ間の互換性により、いくつかの特定のエラーが出ることがあります。
GCC バージョン不一致の解決
linux/compiler-gcc5.h の欠落エラーが出た場合、ヘッダファイルの存在確認が必要です。現行の GCC バージョンとソース側の想定バージョンが乖離していることが原因です。必要なヘッダを手動で追加するか、マクロ定義を書き換えることで回避できます。
シンボル重複定義の問題
return_address 関数の多重定義エラーが生じるケースでは、以下の変更を行う必要があります。
arch/arm/include/asm/ftrace.h: 外部宣言となっている記述を静的宣言に変更します。arch/arm/kernel/return_address.c: 同様に重複する実装部をコメントアウトまたは削除します。
必要ライブラリのインストール
実行時リンク時の不足エラーに対して、32bit 互換ライブラリ群を導入します。
sudo apt install lib32stdc++6 libc6-i386 libstdc++6 lsb-core
ビルド成果の確認
正常に完了した場合、出力ディレクトリに uImage ファイルおよびデバイスツリー blob (.dtb) が生成されています。これらがターゲットボードの起動イメージとして使用可能です。