0

デーモンによって生成され、常に稼働している必要があるスクリプトインタープリターがあります。つまり、ダウンするとすぐに(クラッシュ、セグメンテーションフォールト、通常の終了など)、デーモンはそれを再び生成します。

dlopenこのインタプリタは、 ( )を使用してライブラリを動的に開きますlib1。このライブラリは、他の多くのライブラリ(、、 ...)を開きlib2ますlib3。それらのいくつかは最初のライブラリを参照しています。そのため、呼び出しにはRTLD_GLOBALRTLD_NOWフラグを使用しています。dlopen

この時点まで、すべてがうまく機能しています。

インタプリタが強制終了またはクラッシュして再びスポーンされると、問題が発生します。もう一度dlopenを使用しますが、問題ありません...lib1の関数を正常に呼び出すことができます。lib1のコードでは、から関数を呼び出しますlib2。プログラムはそこで止まります。

クラッシュしていないようです(セグメンテーション違反などはありません)。関数の最初の行には、呼び出しの直前とその他のデバッグ呼び出しがあります。最初のものが実行されます。2つ目はそうではありません。

最後の詳細:lib1実際には、オブジェクトインスタンスを返すC++ライブラリです。すべてのモジュールのdestroyerメソッドlib1とすべてのヘッダーを省略しています。誰かがそれを重要だと判断した場合、私はより多くの情報を与えることができます。

誰かが何が起こっているのかについて何か考えを持っていますか?

シナリオを説明するために、「擬似」コードを検討してください。

通訳者:

Lib1_obj *instance;

void interpreter_start() {
  // dlopen lib1
  // get lib1_creator symbol.
  instance = lib1_creator();
}

void interpreter_on_event_X() {
  int x = instance->method1();
  printf("x = %d\n", x);
}

Lib1:

class Lib1_obj {
public:
  int method1() {
    printf("Check point 1.\n");
    return lib2_do_something();
  }
}

Lib1_obj * creator() {
  return new Lib1_obj();
}

Lib2:

lib2_do_something() {
  printf("Check point 2.\n");
  return 1;
}

dlcloseこの問題は、プロセスが強制終了されたときに呼び出すことができないという事実に関係しているのではないかと思います。dlopenメカニズムを台無しにする可能性はありますか?

どうもありがとう。

4

1 に答える 1

0

-fPICオプションでコンパイルされていないライブラリがありました。そうすることで問題は解決しました。

助けてくれたuser315052に感謝します。

于 2012-06-12T13:14:28.927 に答える