staticky zlinkovany program a dlopen

Mirek Fidler cxl na centrum.cz
Pátek Září 13 13:51:24 CEST 2002


Nevite nekdo, jestli je mozne dynamicky loadovat .so do staticky
zlinkovaneho programu ?

Jasne, jednoducha odpoved je "ano", ale neni tam problem s tim, ze tam pak
glibc je vlastne dvakrat ? Jednou jako staticka soucast programu, podruhe
jako .so vyzadovane (s nejvetsi pravdepodobnosti) programem, ktery je
prilinkovany ?

Kazdopadne, zkousim neco takoveho:

#include <stdio.h>
#include <stdlib.h>

#include <dlfcn.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>

Display* (*iXOpenDisplay)(_Xconst char*);
XIM      (*iXOpenIM)(Display*, struct _XrmHashBucketRec*, char*, char*);

int main(int argc, char *argv[])
{
 Display *dpy;
    XIM im;
    void *xlib = dlopen("libX11.so", RTLD_LAZY);
    if(!xlib) fprintf(stderr, "libX11.so missing");
    iXOpenDisplay = (Display* (*)(_Xconst char*))dlsym(xlib,
"XOpenDisplay");
    iXOpenIM = (XIM (*)(Display*, struct _XrmHashBucketRec*, char*,
char*))dlsym(xlib, "XOpenIM");
    if ((dpy = iXOpenDisplay(NULL)) == NULL) {
        (void) fprintf(stderr, "Cannot open Display.");
        exit(1);
    }
    if ((im = iXOpenIM(dpy, NULL, NULL, NULL)) == NULL) {
        (void)fprintf(stderr, "Couldn't open input method");
        exit(1);
    }
    printf("XOpenIM ok.");
 return EXIT_SUCCESS;
}

...a spadne to nekde hluboko v XOpenIM..

Ostatne, celou vec zkousim proto, ze kdyz libX11 prilinkuju staticky, tak
XOpenIM nechodi (vraci vzdycky NULL). Mozna to nejak souvisi...

Mirek





Další informace o konferenci Linux