From a28652f9c35fbc009245382a5cc2a022f42366fc Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 19 Jun 2006 00:57:18 -0400 Subject: Another round of loader sense-beating. Remove the (unused) server export lists, a really bad hash table, the last vestiges of the other backends, and some miscellaneous cleanups. Good for dropping 300k from the size of the built server on x86. --- hw/xfree86/loader/dlloader.c | 107 +++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 65 deletions(-) (limited to 'hw/xfree86/loader/dlloader.c') diff --git a/hw/xfree86/loader/dlloader.c b/hw/xfree86/loader/dlloader.c index 835deda49..3c62f863b 100644 --- a/hw/xfree86/loader/dlloader.c +++ b/hw/xfree86/loader/dlloader.c @@ -1,7 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/dlloader.c,v 1.13 2003/10/15 16:29:02 dawes Exp $ */ - /* - * * Copyright (c) 1997 The XFree86 Project, Inc. * * Permission to use, copy, modify, distribute, and sell this software @@ -23,7 +20,18 @@ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. */ + * SOFTWARE. + */ + +/* + * Once upon a time, X had multiple loader backends, three of which were + * essentially libdl reimplementations. This was nonsense so we chucked + * it, but we still retain the factorization between loader API and + * platform implementation. This file is the libdl implementation, and + * currently the only backend. If you find yourself porting to a platform + * without working libdl - hpux, win32, some forsaken a.out host, etc. - + * make a new backend rather than hacking up this file. + */ #ifdef HAVE_XORG_CONFIG_H #include @@ -36,82 +44,67 @@ #include #include "os.h" -#include "sym.h" #include "loader.h" #include "dlloader.h" -#ifdef DL_LAZY +#if defined(DL_LAZY) #define DLOPEN_LAZY DL_LAZY -#else -#ifdef RTLD_LAZY +#elif defined(RTLD_LAZY) #define DLOPEN_LAZY RTLD_LAZY -#else -#ifdef __FreeBSD__ +#elif defined(__FreeBSD__) #define DLOPEN_LAZY 1 #else #define DLOPEN_LAZY 0 #endif -#endif -#endif -#ifdef LD_GLOBAL + +#if defined(LD_GLOBAL) #define DLOPEN_GLOBAL LD_GLOBAL -#else -#ifdef RTLD_GLOBAL +#elif defined(RTLD_GLOBAL) #define DLOPEN_GLOBAL RTLD_GLOBAL #else #define DLOPEN_GLOBAL 0 #endif -#endif #if defined(CSRG_BASED) && !defined(__ELF__) -#define NEED_UNDERSCORE_FOR_DLLSYM +#define DLSYM_PREFIX "_" +#else +#define DLSYM_PREFIX "" #endif -/* - * This structure contains all of the information about a module - * that has been loaded. - */ typedef struct { int handle; void *dlhandle; int flags; } DLModuleRec, *DLModulePtr; -/* - * a list of loaded modules XXX can be improved - */ +/* Hooray, yet another open coded linked list! FIXME */ typedef struct DLModuleList { DLModulePtr module; struct DLModuleList *next; } DLModuleList; -DLModuleList *dlModuleList = NULL; +static DLModuleList *dlModuleList = NULL; -void * +static void * DLFindSymbolLocal(pointer module, const char *name) { DLModulePtr dlfile = module; void *p; char *n; -#ifdef NEED_UNDERSCORE_FOR_DLLSYM - static const char symPrefix[] = "_"; -#else - static const char symPrefix[] = ""; -#endif + static const char symPrefix[] = DLSYM_PREFIX; - n = xf86loadermalloc(strlen(symPrefix) + strlen(name) + 1); - sprintf(n, "%s%s", symPrefix, name); + n = malloc(strlen(symPrefix) + strlen(name) + 1); + if (strlen(symPrefix)) + sprintf(n, "%s%s", symPrefix, name); + else + sprintf(n, "%s", name); p = dlsym(dlfile->dlhandle, n); - xf86loaderfree(n); + free(n); return p; } - -/* - * Search a symbol in the module list - */ void * DLFindSymbol(const char *name) { @@ -127,75 +120,59 @@ DLFindSymbol(const char *name) return NULL; } -/* - * public interface - */ void * -DLLoadModule(loaderPtr modrec, int fd, LOOKUP ** ppLookup, int flags) +DLLoadModule(loaderPtr modrec, int fd, int flags) { DLModulePtr dlfile; DLModuleList *l; int dlopen_flags; - if ((dlfile = xf86loadercalloc(1, sizeof(DLModuleRec))) == NULL) { - ErrorF("Unable to allocate DLModuleRec\n"); + if ((dlfile = calloc(1, sizeof(DLModuleRec))) == NULL) { + ErrorF("Unable to allocate DLModuleRec\n"); return NULL; } dlfile->handle = modrec->handle; if (flags & LD_FLAG_GLOBAL) - dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL; + dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL; else - dlopen_flags = DLOPEN_LAZY; + dlopen_flags = DLOPEN_LAZY; dlfile->dlhandle = dlopen(modrec->name, dlopen_flags); if (dlfile->dlhandle == NULL) { ErrorF("dlopen: %s\n", dlerror()); - xf86loaderfree(dlfile); + free(dlfile); return NULL; } - l = xf86loadermalloc(sizeof(DLModuleList)); + l = malloc(sizeof(DLModuleList)); l->module = dlfile; l->next = dlModuleList; dlModuleList = l; - *ppLookup = NULL; return (void *)dlfile; } -void -DLResolveSymbols(void *mod) -{ - return; -} - -int -DLCheckForUnresolved(void *mod) -{ - return 0; -} - void DLUnloadModule(void *modptr) { DLModulePtr dlfile = (DLModulePtr) modptr; DLModuleList *l, *p; - /* remove it from dlModuleList */ + /* remove it from dlModuleList. */ if (dlModuleList->module == modptr) { l = dlModuleList; dlModuleList = l->next; - xf86loaderfree(l); + free(l); } else { p = dlModuleList; for (l = dlModuleList->next; l != NULL; l = l->next) { if (l->module == modptr) { p->next = l->next; - xf86loaderfree(l); + free(l); break; } p = l; } } dlclose(dlfile->dlhandle); - xf86loaderfree(modptr); + free(modptr); } -- cgit v1.2.3