diff --git a/include/SDL_loadso.h b/include/SDL_loadso.h index 0359eae17..50df510d8 100644 --- a/include/SDL_loadso.h +++ b/include/SDL_loadso.h @@ -57,6 +57,16 @@ extern "C" { */ extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); +/** + * This function returns a handle to an already-loaded shared object and + * returns a pointer to the object handle. If the object file was not loaded + * the function returns NULL. This function adds a reference to the shared + * object, so the caller should call SDL_UnloadObject when they are finished + * with this reference to ensure that the object can be unloaded. + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void *SDLCALL SDL_GetLoadedObject(const char *sofile); + /** * Given an object handle, this function looks up the address of the * named function in the shared object and returns it. This address diff --git a/src/loadso/dlopen/SDL_sysloadso.c b/src/loadso/dlopen/SDL_sysloadso.c index db8422221..79df107f0 100644 --- a/src/loadso/dlopen/SDL_sysloadso.c +++ b/src/loadso/dlopen/SDL_sysloadso.c @@ -41,6 +41,13 @@ SDL_LoadObject(const char *sofile) return (handle); } +void * +SDL_GetLoadedObject(const char *sofile) +{ + void *handle = dlopen(sofile, RTLD_NOLOAD); + return (handle); +} + void * SDL_LoadFunction(void *handle, const char *name) { diff --git a/src/loadso/windows/SDL_sysloadso.c b/src/loadso/windows/SDL_sysloadso.c index cbbd92978..4ff36af0e 100644 --- a/src/loadso/windows/SDL_sysloadso.c +++ b/src/loadso/windows/SDL_sysloadso.c @@ -46,6 +46,22 @@ SDL_LoadObject(const char *sofile) return handle; } +void * +SDL_GetLoadedObject(const char *sofile) +{ + LPTSTR tstr = WIN_UTF8ToString(sofile); + void *handle = (void *) GetModuleHandle(tstr); + + /* if we got a handle, call LoadLibrary to get + * it again with the ref count incremented. + * We do this to match the dlopen version of this function */ + handle = (void *)LoadLibrary( tstr ); + + SDL_free(tstr); + + return handle; +} + void * SDL_LoadFunction(void *handle, const char *name) {