我有一个由守护进程生成的脚本解释器,并且必须始终处于运行状态。 换句话说,一旦它出现故障(崩溃、段错误、正常终止等),守护进程就会再次生成它。
此解释器使用 dlopen
(lib1
) 动态打开库。
该库打开了许多其他库(lib2
、lib3
,...)。其中一些引用了第一个库。因此,我在 dlopen
调用中使用 RTLD_GLOBAL
和 RTLD_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/