C++: Virtuelle Funktionen von Objekten aus shared libraries [solved]

Edit: Ich hasse mich selber X(
Für alle die ähnliche Probleme haben:
1. Es schadet nicht zu überprüfen, ob die Libraries tatsächlich geladen wurden (beim Beispiel weiter unten müsste es "./library.so" heißen anstelle von "library.so")
2. Man sollte die Library erst dann wieder entladen, wenn die Objekte nicht mehr verwendet werden.


Ich möchte gerne ein Objekt, welches virtuelle Funktionen enthält, innerhalb einer dynamisch nachgeladenen Library erstellen:
Code:
int main(int argc, char **argv)
{
	void *libHandle = dlopen("library.so", RTLD_NOW);
	Class* (*createFunction)() = (Class* (*)())dlsym(libHandle, "createFunction");
	Class *a = createFunction();

	a->virtFunc();

	delete a;
	dlclose(libHandle);
}

Die dazugehörige Klasse sieht so aus:
Code:
class Class
{
	public:
		virtual void virtFunc();
};

void Class::virtFunc()
{
	printf("I was called\n");
}

Und noch bei der Library dabei ist folgender Quellcode:
Code:
extern "C" Class* createFunction()
{
	return new Class();
}
(die includes habe ich mir alle gespart, siehe Anhang)

Das Zeug crasht aber aus Prinzip immer beim Aufruf der virtuellen Funktion:
Code:
(gdb) break main
Breakpoint 1 at 0x80485cd: file main.cpp, line 7.
(gdb) run
Starting program: /home/benediktibk/Desktop/blub/a.out 

Breakpoint 1, main (argc=1, argv=0xbffff434) at main.cpp:7
7		void *libHandle = dlopen("library.so", RTLD_NOW);
(gdb) n
8		Class* (*createFunction)() = (Class* (*)())dlsym(libHandle, "createFunction");
(gdb) n
9		Class *a = createFunction();
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb)

Meine Frage: Warum? Ist da die vtable irgendwie im Anus Afrikanus, muss man das Zeug speziell linken oder was zur Hölle ist da los?!

Ich entschuldige mich hiermit für meinen kleinen Anfall, aber das ist nun mal sehr ärgerlich.

Vielen Dank fürs Durchlesen (und hoffentlich auch helfen),
benediktibk
 
Zuletzt bearbeitet:
Zurück
Oben