我们有一个插件,它由应用程序中的一些共享库构成,我们需要在应用程序运行时对其进行更新。出于性能原因,我们在卸载旧插件之前加载并开始使用新插件,并且只有当所有线程都使用旧插件完成时,我们才会卸载它。由于新插件和旧插件的库具有相同的符号,因此我们dlopen()
使用RTLD_LOCAL
. 如果我们不意外地将新插件从内部函数调用到旧插件中的符号。
插件的一个库对由插件dynamic_cast()
的另一个库创建的对象执行。这适用于 HP-UX、AIX、Solaris 和 Windows,但不适用于 Linux。据我所知,这是因为所有这些操作系统(编译器)都使用类的名称来比较类型(在dynamic_cast()
.type_info
对象(因为它是用 加载的RTLD_LOCAL
)地址不同,因此相等的类型似乎不等于dynamic_cast()
.
有没有办法执行以下操作之一:
- 仅
type_info
像提供对象一样加载对象RTLD_GLOBAL
。 - 使编译器使用类名比较而不是
type_info
地址来比较类型。
? 我们使用的编译器是:
$ icpc -V
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 12.0.0.084 Build 20101006
Copyright (C) 1985-2010 Intel Corporation. All rights reserved.