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