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

标签 c++ c dlopen

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

此解释器使用 dlopen (lib1) 动态打开库。 该库打开了许多其他库(lib2lib3,...)。其中一些引用了第一个库。因此,我在 dlopen 调用中使用 RTLD_GLOBALRTLD_NOW 标志。

到目前为止,一切正常。

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

看起来它没有崩溃(没有段错误或其他什么)。 在函数的第一行调用之前有一个调试调用以及其他调用。 第一个被处决。第二个则不然。

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

有人知道可能会发生什么吗?

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

口译员:

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 机制?

非常感谢。

最佳答案

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

感谢 user315052 的帮助。

关于c++ - 基于 dlopen 的应用程序第二次运行不同(错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10907043/

相关文章:

c++ - 如何在不更改其他 channel 的情况下有效地将 cv::Mat 的给定 channel 设置为给定值?

c - __stack_size__, __stack_end__ 符号在 'C'

arrays - 如何将数组从程序集传递到 C 函数

c - 从通信资源中读取

c - 同级 .so 文件中符号的可见性

ios - 应用程序终止后,dlopen返回NULL

c++ - 使用 Flatbuffer Union 导致双重释放或损坏错误

c++ - `obj.operator+=(rhs)` 与 `obj += rhs`

c++ - 这些天 'ends' 有什么用?

c - 为什么插件动态库在应用程序中找不到符号?