Сбой 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)Пример кода имеется в наличии

Ответы на вопрос(4)

Ваш ответ на вопрос