開発マシンで chroot を使用して、組み込み Linux インストールで実行するアプリケーションを構築できますか?

開発マシンで chroot を使用して、組み込み Linux インストールで実行するアプリケーションを構築できますか?

組み込み Linux インストールで実行するアプリケーションを開発しようとしています。このアプリケーションには、開発マシンにインストールされているものよりも古いバージョンの libc が付属しています。開発マシンに chroot 環境を作成し、組み込みデバイスからライブラリをコピーして chroot 環境がデバイスをミラーリングするようにしてからアプリケーションをビルドした場合、デバイスで実行しても安全でしょうか? 開発マシンとデバイスはどちらも x86 32 ビットなので、クロスコンパイルする必要はないと思います。

また、私が作成したアプリケーションで追加のライブラリ (デバイス上に存在しない) へのリンクが必要な場合、chroot 内の開発マシンでこれらのライブラリをビルドし、アプリケーションを展開するためにデバイスにコピーするだけで安全でしょうか?

この件に関して私が読んだすべての情報から、すべてが正しくリンクしていることを保証できる唯一の方法は、実際にデバイス上でアプリケーションをビルドすることであると思われますが、これは最小限のインストールであり、gcc のインストールが付属していないため、選択肢にはなりません。

答え1

これは通常機能します。試してみることをお勧めしますが、注意すべき点がいくつかあります。

  • ビルド時には、ターゲットの CPU アーキテクチャと機能に合わせてバイナリをビルドする必要があります。両方とも x86 なので、これは大いに役立ちますが、sse3 などのプロセッサ機能の使用には注意が必要です。ターゲットのインストールに存在しない機能を利用するバイナリをビルドすると、動作しません。

  • ビルド システムのカーネルは、chroot 環境の動作に何らかの影響を及ぼす可能性があります。chroot とホスト システムで異なるカーネルを使用することはできないため、両者の間に矛盾が生じる可能性があります。ただし、アプリは一般的に最終的には libc を介してカーネルと通信します。libc は、このような問題を防ぐのに役立つ標準インターフェイスを提供します。

  • libc は、ある程度カーネルと互換性がある必要があります。組み込みシステムの libc は、インターフェースの変更によってはカーネルと完全に互換性がない可能性があります。ただし、libc がカーネルより古いものであれば、問題になる可能性は低いです (古いカーネル インターフェースは、古いバイナリをサポートするために残っている可能性が高いです)。

  • ホスト システムのサービスは組み込みシステムから参照できます。これは、プロセス テーブル、ネットワーク インターフェイスなどを共有するため、どの chroot でも共通です。

  • 「追加ライブラリ」については、静的リンクを使用してアプリケーションにリンクできます。そうすれば、デバイスにライブラリを展開する必要がなくなります。結果は状況によって異なります。

代わりに仮想マシンを使用してこれを行うことを検討してください。必ずしもすべての懸念事項 (プロセッサの機能/フラグなど) がなくなるわけではありませんが、組み込みシステムに非常に近い環境を実現できます。つまり、同じカーネルを使用し、同じブート プロセスを実行し、ホストのサービスによる汚染を回避できます...

chroot 内にビルド ツールチェーンを設定する場合は、新しいファイルを組み込みシステムにコピーする方法を検討する必要があることに注意してください。ツールチェーン ファイル (gcc など) はコピーしない方がよいでしょう。

セットアップしてテスト アプリケーションを作成し、ライブラリなどを構築して、組み込みシステムに移行したときにどれだけうまく動作するかを確認してください。

関連情報