Сбой dynamic_cast при использовании с dlopen / dlsym
Позвольте мне заранее извиниться за длинный вопрос. Это настолько коротко, насколько я мог сделать, что, к сожалению, не очень коротко.
НастроитьЯ определил два интерфейса, A и B:
class A // An interface
{
public:
virtual ~A() {}
virtual void whatever_A()=0;
};
class B // Another interface
{
public:
virtual ~B() {}
virtual void whatever_B()=0;
};
Затем у меня есть общая библиотека «testc», которая создает объекты класса C, реализует как A, так и B, а затем передает указатели на их A-интерфейс:
class C: public A, public B
{
public:
C();
~C();
virtual void whatever_A();
virtual void whatever_B();
};
A* create()
{
return new C();
}
Наконец, у меня есть вторая общая библиотека "testd", которая занимаетA*
в качестве входных данных, и пытается привести его кB*
, с помощьюdynamic_cast
void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}
Наконец, у меня есть основное приложение, прохождениеA*
Между библиотеками:
A* a = create();
process(a);
ВопросЕсли я создаю свое основное приложение, связываясь с библиотеками 'testc' и 'testd', все работает как положено. Однако, если я изменю основное приложение, чтобы оно не связывалось с 'testc' и 'testd', а вместо этого загружало их во время выполнения, используяdlopen
/dlsym
тогдаdynamic_cast
выходит из строя.
Я не понимаю почему. Есть какие-нибудь подсказки?
Дополнительная информацияПротестировано с gcc 4.4.1, libc6 2.10.1 (Ubuntu 9.10)Пример кода имеется в наличии