0

我有一个脚本解释器,它是由一个守护进程生成的,并且必须一直处于运行状态。换句话说,一旦它发生故障(崩溃、段错误、正常终止等),守护程序就会再次生成它。

dlopen该解释器使用( )动态打开一个库lib1。这个库打开了很多其他的库(lib2, lib3, ...)。其中一些引用了第一个库。所以我在通话中使用RTLD_GLOBALandRTLD_NOW标志dlopen

到目前为止,一切正常。

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

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

最后一个细节:lib1实际上是一个返回对象实例的 C++ 库。我lib1从所有模块中省略了destroyer方法和所有头文件。如果有人认为这很重要,我可以提供更多信息。

有人对可能发生的事情有任何想法吗?

为了说明场景,请考虑“伪”代码:

口译员:

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);
}

库1:

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

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

库2:

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

dlclose我怀疑这个问题与进程被杀死时我无法调用的事实有关。是否有可能搞乱 dlopen 机制?

非常感谢。

4

1 回答 1

0

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

感谢 user315052 的帮助。

于 2012-06-12T13:14:28.927 回答