PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SharedObject, Executable und StaticLibrary ->Connection?



tommy@linux
09-08-2005, 06:24
Hi,

also ich habe eine statische Library in der allerhand Funktionen enthalten sind.
Desweiteren ein Executable welches die statische Libary nutzt.

Das problem was ich jetzt habe ist, das ich ein sharedobject dynamisch zur Laufzeit hinzulinke und in diesem Funktionen der stat.Library genutzt werden. Manche Funktionen gehen, bei anderen kommt ein SegmentationFault? Im Executable kann ich alle Funktionen problemlos nutzen(warum auch nicht....). Ich habe keine Ahnung warum?

Danke fuer Hilfe.

PS: Das executable laedt das .so
-------------------------------
Lade das .so mit Hilfe:



InteractionManager::InteractionManager(string soPath, string function)
{
module = dlopen((char *)soPath.c_str(), RTLD_LAZY);
if( !module)
{
cerr<<"Could not find so:"<<soPath<<endl;
exit(1);
}

dlerror();
interact = (void (*)(Node*))dlsym(module, (char *)function.c_str());
if((error = dlerror()))
{
cerr<<"Could not find Function: "<<function<<"Error: "<<error<<endl;
exit(1);
}
}

Joghurt
09-08-2005, 12:50
Ist die .so auch von dir compiliert? Ist es eine C++-Library?

Von G++ 3.2 auf 3.3 und von 3.4 auf 4.0 hat sich nämlich das ABI geändert; C++-Bibliotheken dieser verschiedenen Versionen sind nicht untereinander kompatibel.

tommy@linux
10-08-2005, 00:53
alles mit demselben Compiler gemacht.
Ich verstehe das nicht ganz. habe am Ende eine Funktion B geschrieben, die dasselbe macht wie eine Funktion A, und A funzt bei beiden, und B nur im Exectuable????

Joghurt
10-08-2005, 09:38
Also ohne Glaskugel oder Code kann ich nichts machen; und beides hab ich nicht.

Kannst du deinen Code (incl. so-quellcode etc.) nicht mal irgendwo hochladen und den Link posten?

tommy@linux
17-09-2005, 01:22
das waere leider zu viel.... .

Das Problem ist, das irgendwas beim linken schief geht, denke ich mal.

Hat jemand mal ein aehnliches problem mit einem .so gehabt?

Joghurt
17-09-2005, 01:25
Vielleicht hast du auch die -fPIC Option vergessen.
Oder Programm und Library benutzen unterschiedliche Versionen der libc.
Oder, oder, oder...

Es gibt zuviele Möglichkeit, ohne genauere Infos wird dir hier niemand helfen können.

"Wenn ich eine Linkskurve fahre, quietscht irgendwas. Hatte jemand schonmal das selbe Problem?"

tommy@linux
17-09-2005, 01:31
das dumme ist halt ich weiss nicht was ich genaueres schreiben soll.
Alles ist mit dem selben Compiler gebaut, ich verwende -fPIC(geht das auch ohne??), und wie gesagt Funktion A geht, B(Copy A) nicht.... .

Ich denke einfach das was beim linken schief geht was auch immer...

locus vivendi
17-09-2005, 08:08
das dumme ist halt ich weiss nicht was ich genaueres schreiben soll.
Zum Beispiel die *genaue* Kommandozeile, mit der jedes Modul übersetzt wird.

Alles ist mit dem selben Compiler gebaut, ich verwende -fPIC(geht das auch ohne??),
Fpic sollte meines Wissens auf die Korrektheit keinen Einfluss haben. Es ist allerdings so, dass Bibliotheken die ohne Fpic-Option übersetzt wurden, effektiv nicht speichesparend gemeinsam benutzt werden können; Jedes Programm bekommt eine eigene Kopie der Bibliothek.


Ich denke einfach das was beim linken schief geht was auch immer...

Gut möglich, aber nicht der einzige Erklärungsansatz. Versuch mal dein Hauptmodul mit "W,l--export-dynamic" zu linken. (du benutzt doch den GCC zum Linken, oder?) Dazu kannst du die Erklärung in der Ld Manpage nachlesen. Ebenfalls in der Ld-Manpage ist eine Erklärung zur Ld-Option "-Bsymbolic". Das wäre auch ein Kandidat.

Joghurt
18-09-2005, 13:22
typo: Die Option muss "-Wl,--export-dynamic" heißen.