shared object (.so) dynamisch nachladen

kale1990

kale1990

Jungspund
hallo zusammen,

ich habe ein shared-object (.so) und möchte das in mein executable so mit hineinlinken, dass es erst geladen wird wenn eine funktion aus diesem shared-object aufgerufen wird, und nicht schon während des programm-starts!!

danke schonmal
 
Eigentlich haette ich gedacht, dass das sowieso so ist. Wenn nicht, wirst Du wohl den Kernel hacken muessen, da der doch bestimmt dafuer zustaendig ist, wann was geladen wird.
 
benutze solaris 10, weiß da einer eventuell genauer bescheid oder kann mir hier noch hinweise geben? das muss doch über link(ld)-parameter funktionieren
 
benutze solaris 10, weiß da einer eventuell genauer bescheid oder kann mir hier noch hinweise geben? das muss doch über link(ld)-parameter funktionieren
Na, jetzt war ich doch neugierig. Bei GNU ld (GNU ld (GNU Binutils for Debian) 2.18.0.20080103) gibt's die Option '-zlazy', welche laut man-page das macht, was Du moechtest:
man ld schrieb:
lazy
When generating an executable or shared library, mark it to
tell the dynamic linker to defer function call resolution to
the point when the function is called (lazy binding), rather
than at load time. Lazy binding is the default.
Aber offenbar ist das tatsaechlich die Voreinstellung. Was sagt denn die man-page unter Solaris dazu?
Ich moechte jetzt auch zu gern wissen, wozu Du so eine spezielle Option benoetigst.
 
es geht hierbei um ein server-runtime-system das sich bei einer neue client-verbindung forkt...eine fehlerbehebung oder erweiterung einer bibliothek hätte immer den neustart des kompletten runtimes zur folge.
außer es werden die bibliotheken erst geladen wenn sie verwendet werden, dann nämlich reicht eine neue client-verbindung(fork) und das neue laden der bibliothek zur aktivieren des "neuen" .so-files...
hoffe ich hab das verständlich erklären könne.

habe mittlerweile auch das mit dem lazy-load gefunden: http://docs.sun.com/app/docs/doc/817-1984/chapter3-1?a=view
klappt bisher aber noch nicht!

mit elfdump -d rts erhalte ich schon das das gewünschte shared-object(.so) [LAZY] geladen werden soll, aber die funktionen finde ich nicht in der symboltabelle des runtimes (elfdump -y rts)

kann mir hier einer weiterhelfen


danke für die bemühungen schonmal!
 
Zuletzt bearbeitet:
hat denn keiner eine idee?

Ich kenne elfdump nicht und habe auch kein Solaris hier, doch kannst Du nicht mal eine kleines Programm und Bibliothek schreiben, die das Verhalten simulieren, damit Du testen kannst, ob es vielleicht doch funktioniert? Vielleicht verstehst Du dadurch auch das Problem dann selber besser.
 
Hi,
Ich denke du willst nicht dynamisch linken sondern die libraries selbst laden.
D.h. man dlopen ist dein Freund zum Einstieg ... ich hab mal unter FreeBSD sowas gefummelt, nur ein Ausschnitt ...
Code:
       directory=opendir(".");

        while ((dep=readdir(directory)) != NULL) {
                if ( (ext=rindex(dep->d_name,'.')) && ((strcmp(dyn,ext) == 0)) ) {
                                printf("Loading module %s\n",dep->d_name);
                                /* load module */
                                if ( (test=dlopen(dep->d_name, RTLD_NOW | RTLD_GLOBAL)))
                                {
                                        my_entry = dlsym(test,"myprint");
                                        dlerr=dlerror();
                                        if (dlerr != NULL) {
                                                printf("dlerr: %s\n",dlerr);
                                        }
                                        my_entry("hauah");
                                        addmoduletolist(modlist, dep->d_name, test, my_entry );
                                } else {
                                        dlerr=dlerror();
                                        printf("Rv: %s\n", dlerror());
                                }
                }
        }

        closedir(directory);

HTH,
allesmueller
 
Zuletzt bearbeitet:

Ähnliche Themen

Perl Zeilen Auslesen(logdatei) und auswerten

Samba 3.6.25 - OpenLDAP Setup

Skript soll nicht doppelt laufen... kill pkill pid cron

Papierkorb und BtrFS CoW gleichzeitig möglich?

Menüs von vielen Programmen werden nach Aufrufen nicht angezeigt

Zurück
Oben