Haiku R1/beta6でRISC-Vクロスコンパイラを構築しようとしてハマった話 ─ 手動ビルドの壁

みなさん、こんにちは。

前回、Haiku R1/beta6は「IoTオーケストレーションOS」としてのポテンシャルを秘めているものの、lm3s6965のFreeRTOSデモはQEMU側のイーサネット未実装という落とし穴で詰む、というお話を掲載しました。

今回はその続編です!


HaikuでRISC-Vクロスコンパイラを作ろうとした理由

前回の検証で lm3s6965 の罠を踏んだ結果、ネットワーク通信を行うなら「FreeRTOS + RISC-V virtデモ」の組み合わせが正解だとわかりました。これを進めるには、以下のツールチェーンが必要になります。

  • riscv64-unknown-elf-binutils
  • riscv64-unknown-elf-gcc
  • newlib

FreeRTOSの「RISC-V virtデモ」を動かすため、まずはHaikuのパッケージマネージャ(pkgman)でツールチェーンを探してみたのですが、残念ながらARM用などはあるものの、riscv64 用のベアメタルツールチェーン(riscv64-unknown-elf-gcc)は公式リポジトリに存在しませんでした。

pkgman にパッケージがない以上、Haiku上でソースコードからコンパイルするしかありません。「Linuxなら10分で終わる作業だけど、Haiku上でやってみたらどうなるだろう?」と思い、実験してみることにしました。

その結果、案の定、「深い沼」に落ちてしまいました……。


binutilsは通る。しかしGCCとnewlibで大苦戦……

まずは結果からお話しすると、素直な手順ではすんなりいきませんでした。

コンポーネントHaikuでの手動ビルド結果
binutils通る(–disable-sim –disable-gdb の指定が必須)
GCC途中で GCC_NO_EXECUTABLES となり、本体が生成されない
newlib前段のGCCが未完成のためコンパイルエラー(suffix判定不可)

binutils はオプションを指定することで問題なくビルドできました。

しかし、GCC と newlib のビルドで一気に雲行きが怪しくなってきたのです。


なぜ手動ビルドで引っかかってしまったのか?

1. configureが「実行ファイルを作れない」と判断してしまう

GCCのビルド中、configureスクリプトが「ホスト環境で実行可能ファイルを生成できるか」というテスト(link test)を行います。

Cライブラリ(newlib)が存在しないベアメタル向けGCCの初期ビルドでは、リンクテストが失敗して GCC_NO_EXECUTABLES というフラグがセットされるのは正常な挙動なのですが、Haikuの標準ツールチェーンが持つPIE(位置独立実行形式)関連の挙動や依存関係も複雑に絡み合い、結果として gcc 本体が正しく生成されない状態に陥ってしまいました。

2. fixincludesで止まる

fixincludes は「ホストOSのヘッダーを修正する」仕組みですが、HaikuのPOSIXヘッダー構造は通常のLinux等と大きく異なります。そのためMakefileが適切に作成されず、install の段階でエラーになってしまいました。

make[1]: *** No rule to make target 'install'. Stop.

※ベアメタル向けの場合は –disable-fixincludes を指定して回避するのが一般的です。

3. lto-pluginのリンクエラー

GCCのインストール時、lto-plugin を組み込もうとする段階で libiberty.a が見つからず落ちてしまいました。

ld: cannot find ../libiberty/libiberty.a

newlibがビルドできなかった理由

newlib のconfigureは、「ターゲット用のGCC(この場合は xgcc)が正常にリンクまで動くこと」を前提にテストを行います。

しかし、前段のGCCが完全な状態になっていなかったため、newlib のconfigureチェックで弾かれてしまいました。

configure: error: cannot compute suffix of object files: cannot compile

これはnewlib自体のバグというより、ベアメタル特有の「段階的ビルド(Cライブラリがない状態からどう組み上げるか)」の手順と、Haiku上のビルド環境の相性にハマってしまったのが原因でした。


今回の学び

残念ながら目的を達成することはできず、沼から抜け出せなかったのですが、Haikuの現状を知るにはよい学びの時間でした。

  • Haikuは「親機」としてやっぱり魅力的
    • 軽量・シンプル・リアルタイム性・NVMM仮想化・メタデータFSという構成は、他にはない唯一無二の魅力です。
  • ベアメタルGCCの手動ビルドは一筋縄ではいかない
    • Linux上で慣れた感覚で configure && make を叩くだけでは、ベアメタル特有の段階的ビルドの落とし穴やHaiku固有のヘッダー処理に阻まれてしまいます。
  • RISC-Vの仮想環境を構築するための現時点での最適解
    • HaikuPortsにRISC-V用のクロスコンパイラがまだ用意されていない以上、無理にHaiku上でセルフビルドしようとせず、クロスコンパイル環境(Linux等)でバイナリを用意するか、HaikuPortsにレシピが追加されるのを待つのが賢い選択と言えそうです。

一見すると遠回りに見えますが、こうしたトラブルシューティングを通してOSやツールチェーンの裏側の仕組みが見えてくるのが、マイナーOS探訪の醍醐味ですね。

「Haikuを親機とし、外部で作られたRTOSイメージをNVMM上でオーケストレーションする」という本来のゴールに向けて、引き続き実験を続けていきたいと思います!


今回のような検証、「うちの環境ではどうなんだろう?」と気になった方はいませんか。

ビューローみかみでは、構想段階の壁打ちからPoC・実装・現場導入まで、現場で「使い続けられる」ものづくりを支援しています。 

技術顧問サービスでは、本記事のような技術的な質問・検証にも継続的にお答えしています。「相談したら契約」ということはありません。システムを作らない判断も含めて、率直にお話しします。

▶ 技術顧問サービスの詳細はこちら

気になることがあればお気軽にご相談ください。

本日も最後までお読みいただきありがとうございました。

それでは、よいHaikuライフを!

カテゴリ: IoT

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール