Dynamic_cast falla cuando se usa con dlopen / dlsym

Introducción

Permítanme disculparme por adelantado por la larga pregunta. Es tan corto como pude hacerlo, que desafortunadamente no es muy corto.

Preparar

He 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);
Pregunta

Si 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

Respuestas a la pregunta(4)

Su respuesta a la pregunta