dynamic_cast schlägt bei Verwendung mit dlopen / dlsym fehl

Intro

Lassen Sie mich für die lange Frage entschuldigen. Es ist so kurz wie ich es machen könnte, was leider nicht sehr kurz ist.

Konfiguration

Ich habe zwei Schnittstellen definiert, A und 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;
};

Dann habe ich eine gemeinsam genutzte Bibliothek "testc", die Objekte der Klasse C erstellt, sowohl A als auch B implementiert und dann Zeiger auf ihre A-Schnittstelle verteilt:

class C: public A, public B
{
public:
  C();
  ~C();

  virtual void whatever_A();
  virtual void whatever_B();
};

A* create()
{
  return new C();
}

Schließlich habe ich eine zweite gemeinsam genutzte Bibliothek "testd", die eineA* als Eingabe, und versucht, es zu einem CastB*mitdynamic_cast

void process(A* a)
{
  B* b = dynamic_cast<B*>(a);
  if(b)
    b->whatever_B();
  else
    printf("Failed!\n");
}

Schließlich habe ich Hauptantrag, vorbeiA*zwischen den bibliotheken:

A* a = create();
process(a);
Frage

Wenn ich meine Hauptanwendung erstelle, die mit den Bibliotheken 'testc' und 'testd' verknüpft ist, funktioniert alles wie erwartet. Wenn ich jedoch die Hauptanwendung so ändere, dass sie nicht mit 'testc' und 'testd' verknüpft, sondern zur Laufzeit mit geladen wirddlopen/dlsym, dann ist diedynamic_cast scheitert.

Ich verstehe nicht warum. Irgendwelche Hinweise?

Zusätzliche InformationGetestet mit gcc 4.4.1, libc6 2.10.1 (Ubuntu 9.10)Beispielcode verfügbar

Antworten auf die Frage(4)

Ihre Antwort auf die Frage