From 934c0b922c3927a203f2027f73a472fff5c48d4b Mon Sep 17 00:00:00 2001 From: Tony Puccinelli Date: Tue, 3 Aug 2010 06:25:03 +0000 Subject: got rid of dlopen, dlclose, etc. wrappers svn-id: r51677 --- backends/plugins/elf-loader.cpp | 41 --------------------------------------- backends/plugins/elf-loader.h | 1 - backends/plugins/elf-provider.cpp | 38 ++++++++++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 50 deletions(-) diff --git a/backends/plugins/elf-loader.cpp b/backends/plugins/elf-loader.cpp index 33f97f5586..1b70ed5565 100644 --- a/backends/plugins/elf-loader.cpp +++ b/backends/plugins/elf-loader.cpp @@ -448,46 +448,5 @@ void *DLObject::symbol(const char *name) { return NULL; } - -static char dlerr[MAXDLERRLEN]; - -void *dlopen(const char *filename, int flags) { - DLObject *obj = new DLObject(dlerr); - if (obj->open(filename)) - return (void *)obj; - delete obj; - return NULL; -} - -int dlclose(void *handle) { - DLObject *obj = (DLObject *)handle; - if (obj == NULL) { - strcpy(dlerr, "Handle is NULL."); - return -1; - } - if (obj->close()) { - delete obj; - return 0; - } - return -1; -} - -void *dlsym(void *handle, const char *symbol) { - if (handle == NULL) { - strcpy(dlerr, "Handle is NULL."); - return NULL; - } - return ((DLObject *)handle)->symbol(symbol); -} - -const char *dlerror() { - return dlerr; -} - -void dlforgetsyms(void *handle) { - if (handle != NULL) - ((DLObject *)handle)->discard_symtab(); -} - #endif /* DYNAMIC_MODULES */ diff --git a/backends/plugins/elf-loader.h b/backends/plugins/elf-loader.h index 3f33b681bf..d6273b7e71 100644 --- a/backends/plugins/elf-loader.h +++ b/backends/plugins/elf-loader.h @@ -93,7 +93,6 @@ public: extern "C" { void *dlopen(const char *filename, int flags); int dlclose(void *handle); - void *dlsym(void *handle, const char *symbol); const char *dlerror(); void dlforgetsyms(void *handle); } diff --git a/backends/plugins/elf-provider.cpp b/backends/plugins/elf-provider.cpp index b623f0d881..4d4c66084d 100644 --- a/backends/plugins/elf-provider.cpp +++ b/backends/plugins/elf-provider.cpp @@ -31,6 +31,7 @@ #include "backends/plugins/elf-loader.h" +static char dlerr[MAXDLERRLEN]; class ELFPlugin : public DynamicPlugin { protected: @@ -38,9 +39,15 @@ protected: Common::String _filename; virtual VoidFunc findSymbol(const char *symbol) { - void *func = dlsym(_dlHandle, symbol); + void *func; + if (_dlHandle == NULL) { + strcpy(dlerr, "Handle is NULL."); + func = NULL; + } else { + func = ((DLObject *)_dlHandle)->symbol(symbol); + } if (!func) - warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerror()); + warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerr); // FIXME HACK: This is a HACK to circumvent a clash between the ISO C++ // standard and POSIX: ISO C++ disallows casting between function pointers @@ -62,17 +69,25 @@ public: bool loadPlugin() { assert(!_dlHandle); - _dlHandle = dlopen(_filename.c_str(), RTLD_LAZY); + DLObject *obj = new DLObject(dlerr); + if (obj->open(_filename.c_str())) { + _dlHandle = (void *)obj; + } else { + delete obj; + _dlHandle = NULL; + } if (!_dlHandle) { - warning("Failed loading plugin '%s' (%s)", _filename.c_str(), dlerror()); + warning("Failed loading plugin '%s' (%s)", _filename.c_str(), dlerr); return false; } bool ret = DynamicPlugin::loadPlugin(); - if (ret) - dlforgetsyms(_dlHandle); + if (ret) { + if (_dlHandle != NULL) + ((DLObject *)_dlHandle)->discard_symtab(); + } return ret; } @@ -80,8 +95,15 @@ public: void unloadPlugin() { DynamicPlugin::unloadPlugin(); if (_dlHandle) { - if (dlclose(_dlHandle) != 0) - warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerror()); + DLObject *obj = (DLObject *)_dlHandle; + if (obj == NULL) { + strcpy(dlerr, "Handle is NULL."); + warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerr); + } else if (obj->close()) { + delete obj; + } else { + warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerr); + } _dlHandle = 0; } } -- cgit v1.2.3