У нас есть плагин, который состоит из нескольких общих библиотек в нашем приложении, которые мы должны обновить во время работы приложения.По соображениям производительности мы загружаем и начинаем использовать новый плагин перед выгрузкой старого плагина, и только когда все потоки завершены с использованием старого плагина, мы выгружаем его.Поскольку библиотеки нового плагина и старого плагина имеют одинаковые символы, мы 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.