PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : shared object kann nicht geladen werden



dooley
03-03-2005, 09:33
Hi,

Ich möchte aus einem Programm mit dlopen() ein shared object laden. Aber irgendwie will das nicht. Wenn ich jetzt mit dem gdb durchgehe wird _dl_catch_error() aufgerufen und er springt in meinen Fehlerzweig.

Ich gehe mal davon aus, dass ich alles richtig kompiliert habe.
Also das ausführbare Programm mit -ldl und -rdynamic, und das shared object mit -shared.

Gruß,

dooley

dooley
03-03-2005, 14:45
So meine Bibliothek kann ich jetzt laden. Aber nun kann ich die Symbole nicht auflösen mit dlsym().

Hat einer ne Idee ? Muss ic bei den Funktionen in der Bibliothek noch etwas beachten ?

panzi
03-03-2005, 19:04
So meine Bibliothek kann ich jetzt laden. Aber nun kann ich die Symbole nicht auflösen mit dlsym().

Hat einer ne Idee ? Muss ic bei den Funktionen in der Bibliothek noch etwas beachten ?
Wie zeigt sich das? dlsym() gibt NULL zurück?

dooley
04-03-2005, 09:38
So jetzt klappt's irgendwie.

Ich bin hingegangen und hab mal ein readelf -s the.so | grep <func> gemacht.Nun steht dort ein ziemlicher Buchstabensalat. Wenn ich diesen dlsym gebe kann er dies laden. Aber es muss doch eine Möglichkeit geben eine Funktion über ihren richtigen Namen aufzurufen. Bei libm.so kann man den Kosinus ja auch mit "cos" benutzen (wie in der manpage beschrieben).

Muss man da evtl. nochwas in den Quellen ändern ?

locus vivendi
04-03-2005, 10:27
Nun steht dort ein ziemlicher Buchstabensalat. Wenn ich diesen dlsym gebe kann er dies laden. Aber es muss doch eine Möglichkeit geben eine Funktion über ihren richtigen Namen aufzurufen.
Das hört sich danach an, das du versuchst eine C++ Funktion aufzurufen. Deren Name in der Objektdatei ist "mangled", d.h. nicht im Klartext. Du kannst vesuchen deiner Funktion '' extern "C" '' - Bindung zu verpassen, dann bekommst du üblicherweise einen Klartext-Namen. Oder du setzt dich mit dem ABI deiner C++-Implementierung auseinander, um zu erfahren in welcher Weise die Namen zustande kommen.

dooley
04-03-2005, 12:33
Stimmt, CPP ist dabei.

Das mit dem extern war's und es klappt jetzt.

Ein dickes Dankeschön.

Gruß,

dooley