Simplify dlloader a bit more.

This commit is contained in:
Adam Jackson 2008-02-03 22:49:23 +11:00
parent f750ce53ac
commit ba69904148

View File

@ -71,15 +71,9 @@
#define DLSYM_PREFIX "" #define DLSYM_PREFIX ""
#endif #endif
typedef struct {
int handle;
void *dlhandle;
int flags;
} DLModuleRec, *DLModulePtr;
/* Hooray, yet another open coded linked list! FIXME */ /* Hooray, yet another open coded linked list! FIXME */
typedef struct DLModuleList { typedef struct DLModuleList {
DLModulePtr module; void *module;
struct DLModuleList *next; struct DLModuleList *next;
} DLModuleList; } DLModuleList;
@ -88,19 +82,22 @@ static DLModuleList *dlModuleList = NULL;
static void * static void *
DLFindSymbolLocal(pointer module, const char *name) DLFindSymbolLocal(pointer module, const char *name)
{ {
DLModulePtr dlfile = module;
void *p; void *p;
char *n; char *n;
static const char symPrefix[] = DLSYM_PREFIX; static const char symPrefix[] = DLSYM_PREFIX;
n = malloc(strlen(symPrefix) + strlen(name) + 1); if (strlen(symPrefix)) {
if (strlen(symPrefix)) n = malloc(strlen(symPrefix) + strlen(name) + 1);
sprintf(n, "%s%s", symPrefix, name); sprintf(n, "%s%s", symPrefix, name);
else } else {
sprintf(n, "%s", name); n = name;
p = dlsym(dlfile->dlhandle, n); }
free(n);
p = dlsym(module, n);
if (strlen(symPrefix))
free(n);
return p; return p;
} }
@ -127,7 +124,7 @@ DLFindSymbol(const char *name)
global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL); global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL);
if (global_scope) if (global_scope)
return dlsym(global_scope, name); return DLFindSymbolLocal(global_scope, name);
return NULL; return NULL;
} }
@ -135,23 +132,17 @@ DLFindSymbol(const char *name)
void * void *
DLLoadModule(loaderPtr modrec, int flags) DLLoadModule(loaderPtr modrec, int flags)
{ {
DLModulePtr dlfile; void * dlfile;
DLModuleList *l; DLModuleList *l;
int dlopen_flags; int dlopen_flags;
if ((dlfile = calloc(1, sizeof(DLModuleRec))) == NULL) {
ErrorF("Unable to allocate DLModuleRec\n");
return NULL;
}
dlfile->handle = modrec->handle;
if (flags & LD_FLAG_GLOBAL) if (flags & LD_FLAG_GLOBAL)
dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL; dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL;
else else
dlopen_flags = DLOPEN_LAZY; dlopen_flags = DLOPEN_LAZY;
dlfile->dlhandle = dlopen(modrec->name, dlopen_flags); dlfile = dlopen(modrec->name, dlopen_flags);
if (dlfile->dlhandle == NULL) { if (dlfile == NULL) {
ErrorF("dlopen: %s\n", dlerror()); ErrorF("dlopen: %s\n", dlerror());
free(dlfile);
return NULL; return NULL;
} }
@ -166,7 +157,6 @@ DLLoadModule(loaderPtr modrec, int flags)
void void
DLUnloadModule(void *modptr) DLUnloadModule(void *modptr)
{ {
DLModulePtr dlfile = (DLModulePtr) modptr;
DLModuleList *l, *p; DLModuleList *l, *p;
/* remove it from dlModuleList. */ /* remove it from dlModuleList. */
@ -185,6 +175,5 @@ DLUnloadModule(void *modptr)
p = l; p = l;
} }
} }
dlclose(dlfile->dlhandle); dlclose(modptr);
free(modptr);
} }