動的にリンクされたライブラリを dlopen や友人を介してサンドボックス化することが可能かどうか疑問に思っています。目的は、SEGFAULT などのアプリケーション全体を破壊することなく、ライブラリ内のエラーから回復することです。
誰もがこの分野で何か経験がありましたか?
ライブラリを呼び出す前にfork()を実行し、その結果をマザー プロセスに渡すことができます。親プロセスが子プロセスからのデータを待つようにするか、クラッシュした場合はエラーを報告します。
一般的に言って、例外処理はオペレーティングシステムに大きく依存します。私はいくつかの仮定を立て、いくつかの一般的なガイダンスを提供しようとしています。これは完全な返信ではありませんが、開始する場所として機能する必要があることをご承知おきください。
私はそれを仮定します:
ほとんどの場合、メモリリークからの保護に関心があります。
dlopenについて言及したので、Windows(これはワックスのボール全体です)には興味がありません(そうでなければLoadLibraryと言ったでしょう)
C++シンボルに対するリンクのニュアンスを認識していること。dlopenc++のミニハウツーでそれを読んでいない場合
一般的に言えば
データとコードセグメントのサンドボクシングを提供する特殊なオペレーティングシステムを使用せずに、説明した問題に対する一般的な解決策はありません。これを実行できる信頼できるシステムと特殊なオペレーティングシステムカーネルがありますが、古き良き時代にこれを実行したいと思います。 *nixまたはwindows環境。
コンパイラーのものは問題をさらに複雑にします(C ++コンパイラーはデフォルトで弱いシンボルを生成しますか?通常は生成します)これは、try-catchでの例外処理の方法に影響します。
シグナル(SIGSEGV、SIGFPEなど)を発生させる単純なオペレーティングシステムの例外処理:
sigactionをサポートするPOSIXシステムの下で..。
悪いメモリアドレス指定のような一般的なものから保護したいとしましょう。ライブラリをドロープする前に(.init関数から保護するために)sigactionを使用してSIGSEGをトラップし、ライブラリ内の関数を呼び出す前にシグナルチェックも実行します。SA_STACKを使用して、ハンドラーが適切に制御できるスタックにジャンプすることを確認し、SA_SIGINFOを使用して、ハンドラーがソースに関する情報を取得することを確認してください。
これを始めるのに適した場所は、GNUlibcマニュアルのシグナル処理です。
C ++の場合:ラッパーを使用し、try-catchを使用してソフト例外をキャッチします
{foo();を試してください } catch(){//何かをする}
ここで、fooは、dll内の関数を指す弱い記号です。クラスのロードなどの詳細については、c ++dlopenmini-howtoを参照してください。
より具体的なニーズがある場合は、投稿してください。詳細情報を提供できるかどうかを確認します。
乾杯
セグメンテーション違反をアプリケーションや問題のダイナミックライブラリとどのように区別しますか?cheが説明したように、ライブラリを隔離するための別のプロセスを作成することが最善のアプローチのようです。
編集:
この関連する質問を見つけ、移植性が必要な場合はSIGSEGVハンドラーから戻らないことを提案するCERTアドバイザリを指摘しました。