基于dlopen的应用程序在第二次运行不同(错误)

时间:2012-06-06 01:10:53

标签: c++ c dlopen

我有一个由deamon产生的脚本解释器,并且必须一直在运行。 换句话说,一旦它崩溃(崩溃,段错误,正常终止,等等),守护进程就会再次产生。

此解释器使用dlopenlib1)动态打开库。 该库打开了许多其他库(lib2lib3,...)。其中一些人参考了第一个图书馆。所以我使用RTLD_GLOBALRTLD_NOW标记进行dlopen调用。

到目前为止,一切运作良好。

当解释器被杀或崩溃并再次产生时会出现问题。 我再次使用dlopen,没问题......我可以正常调用lib1的函数。 在lib1的代码中,我调用lib2中的函数。 该计划就在那里停止。

它看起来没有崩溃(没有段错误或其他东西)。 在调用之前有一个调试调用,在函数的第一行有一个调用调用。 第一个被执行。第二个没有。

最后一个细节:lib1实际上是一个返回对象实例的C ++库。 我省略了来自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机制?

非常感谢。

1 个答案:

答案 0 :(得分:0)

有一个未使用-fPIC选项编译的库。 这样做解决了这个问题。

感谢user315052的帮助。