Dynamic_cast falla cuando se usa con dlopen / dlsym
Permítanme disculparme por adelantado por la larga pregunta. Es tan corto como pude hacerlo, que desafortunadamente no es muy corto.
PrepararHe definido dos interfaces, A y 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;
};
Luego, tengo una biblioteca compartida "testc" que construye objetos de clase C, implementa A y B, y luego pasa punteros a su interfaz A:
class C: public A, public B
{
public:
C();
~C();
virtual void whatever_A();
virtual void whatever_B();
};
A* create()
{
return new C();
}
Finalmente, tengo una segunda biblioteca compartida "testd", que toma unA*
como entrada, e intenta convertirlo en unB*
, utilizandodynamic_cast
void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}
Finalmente, tengo la aplicación principal, pasandoA*
's entre las bibliotecas:
A* a = create();
process(a);
PreguntaSi construyo mi aplicación principal, enlazando con las bibliotecas 'testc' y 'testd', todo funciona como se esperaba. Sin embargo, si modifico la aplicación principal para que no se vincule con 'testc' y 'testd', sino que la cargue en tiempo de ejecución usandodlopen
/dlsym
, entonces ladynamic_cast
falla
No entiendo porque. ¿Alguna pista?
Información AdicionalProbado con gcc 4.4.1, libc6 2.10.1 (Ubuntu 9.10)Código de ejemplo disponible