-static und shared libraries
-
Ich bastle gerade ein Pluginsystem. Das funktioniert auch soweit. Ich baue das Plugin mit den zusätzlichen Parametern -fPIC und -shared und lade die benötigten Funktionen des Plugins im Hauptprogramm mit dlopen/dlsym. So weit, so gut.
Problematisch wird es erst, wenn ich das Hauptprogramm mit -static linke, dann bekomme ich beim Laden des Plugins ein segmentation fault mit diesem Callstack.
Linke ich das Plugin nicht gegen pthread, schlägt das Laden des Plugins stattdessen mit "undefined symbol: pthread_mutex_trylock" fehl. Das Hauptprogramm selbst linkt pthread allerdings dazu.
Lustigerweise funktioniert es, wenn das Hauptprogramm ohne -static und das Plugin ohne pthread gelinkt wird.Der Grund, warum ich überhaupt statisch linken will, ist dass das Programm sonst z.B. auf Debian 5 nicht läuft, da die libstdc++-Version nicht zu passen scheint ("/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found").
Als Workaround könnte man vielleicht nur die libstdc++ statisch linken. Hier wird zwar der Switch -static-libstdc++ beschrieben, das quittiert mir gcc (4.4.1) aber mit "g++: unrecognized option '-static-libstdc++'".Interessanterweise kann ich das Plugin laden, wenn ich bei dlopen RTLD_LAZY angebe - jedenfalls bis ich versuche, im Plugin einen Thread zu erstellen. Demnach scheint das Plugin die benötigten libstdc++-Funktionen aus dem Hauptprogramm "entnehmen" zu könnnen, nicht aber die pthread-Funktionen.
Was da intern vorgeht, ist für mich etwas mysteriös.
Im Grunde möchte ich ja nur das Hauptprogramm statisch linken können, ohne dafür Scherereien zu bekommen.
Könnte mir da jemand weiterhelfen?
-
Athar schrieb:
Der Grund, warum ich überhaupt statisch linken will, ist dass das Programm sonst z.B. auf Debian 5 nicht läuft, da die libstdc++-Version nicht zu passen scheint ("/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found").
Als Workaround könnte man vielleicht nur die libstdc++ statisch linken. Hier wird zwar der Switch -static-libstdc++ beschrieben, das quittiert mir gcc (4.4.1) aber mit "g++: unrecognized option '-static-libstdc++'".Da ich mit libstdc++ bzw. libc statisch linken mehr Probleme habe als ich sie zuverlässig reparieren kann, mache ich immer folgendes: mit ldd ermitteln, welche BIBs ich benötige, diese mitlieferen und meinetwegen in /usr/lib/program_abc/ kopieren. Dann benenne ich die Binary in irgemndwas.bin und und lege ein Skript an deren Stelle:
#!/bin/sh # file: /usr/bin/myprogram BINRAY=/usr/bin/myprogram.bin export LD_LIBRARY_PATH="/usr/lib/program_abc:${LD_LIBRARY_PATH}" exec ${BINARY} $@
-
Danke für den Tipp. Ich hab's jetzt so gemacht und es läuft nun auch unter Debian problemlos, inklusive Plugins und Threads.
-
Bei Pluginsystemen muss man immer durchgehend dynamisch linken, da sonst die Speicherverwaltung fehlschlägt.
lg