我们有一个插件,由我们应用程序中的几个共享库构成,需要在应用程序运行时更新。出于性能考虑,在卸载旧插件之前,我们加载并开始使用新插件,只有当所有线程都使用旧插件完成后,我们才卸载它。由于新插件和旧插件的库中具有相同的符号,因此我们使用
插件的一个库对由插件的另一个库创建的对象进行
有没有办法执行以下操作之一:
dlopen()
和RTLD_LOCAL
。如果不这样做,新插件的调用将意外地从旧插件的内部函数转到符号。插件的一个库对由插件的另一个库创建的对象进行
dynamic_cast()
。这在HP-UX、AIX、Solaris和Windows上可以工作,但在Linux上不行。据我所知,这是因为所有这些操作系统(编译器)都使用类名来比较类型(在dynamic_cast()
中),但Linux使用名称字符串地址来执行此比较(以提高性能),由于每个库都有自己的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.