Linuxカーネルと静的にリンクされた単一のバイナリのみで構成される非常に小さな組み込みシステムがinitとして実行されていると仮定します。バイナリが実行時に外部プラグインを動的にロードできるようにする必要があります。
Linuxで可能ですか?Dlopenは共有ライブラリでのみ機能し、動的リンクにより静的バイナリはシンボルを外部にエクスポートしないため、他の方法はありますか?
「プラグイン」を子プロセスとして実行し、IPC(共有メモリ、パイプなど)を介して通信することができます。
main
それらは独自のプロセススペースに存在するため、関数を直接呼び出すことはできません(さらに、静的にリンクされている場合は、到達できる以外の関数エントリポイントはありません)。 (例)名前付きパイプを介してコマンドを送信するか、共有メモリ構造でデータを渡します。
2番目のバイナリをロードすると、静的リンクの主な利点の1つが失われることに注意してください(libc
ロードされたコピーが2つあるため)。したがって、弾丸を噛んで動的リンクを使用することを検討することをお勧めします。ダイナミックリンクのサポートを追加することで数libc
百Kを消費しますが、GNUは約2Mであるため、1つのプラグインをロードすると、すでに180万の節約になります。また、ロードするプラグインを追加するたびに、2Mを節約できます。
Dlopenは共有ライブラリでのみ機能し、動的リンクにより静的バイナリはシンボルを外部にエクスポートしません
を使用すると、静的にリンクされたバイナリから共有ライブラリをdlopenできますglibc
。メインの実行可能ファイルからシンボルを参照するためにプラグインが必要な場合は、これと同様に、それらへのポインターをプラグインに渡す必要があります。
それを行う他の方法はありますか?
独自のモジュールローダーを作成することもできます。Linuxカーネルはこれを行い、同様に行いXorg
ます。