#include "SDL_internal.h"
#ifdef SDL_LOADSO_DLOPEN
#include <stdio.h>
#include <dlfcn.h>
#ifdef SDL_VIDEO_DRIVER_UIKIT
#include "../../video/uikit/SDL_uikitvideo.h"
#endif
SDL_SharedObject *SDL_LoadObject(const char *sofile)
{
void *handle;
const char *loaderror;
#ifdef SDL_VIDEO_DRIVER_UIKIT
if (!UIKit_IsSystemVersionAtLeast(8.0)) {
SDL_SetError("SDL_LoadObject requires iOS 8+");
return NULL;
}
#endif
handle = dlopen(sofile, RTLD_NOW | RTLD_LOCAL);
loaderror = dlerror();
if (!handle) {
SDL_SetError("Failed loading %s: %s", sofile, loaderror);
}
return (SDL_SharedObject *) handle;
}
SDL_FunctionPointer SDL_LoadFunction(SDL_SharedObject *handle, const char *name)
{
void *symbol = dlsym(handle, name);
if (!symbol) {
bool isstack;
size_t len = SDL_strlen(name) + 1;
char *_name = SDL_small_alloc(char, len + 1, &isstack);
_name[0] = '_';
SDL_memcpy(&_name[1], name, len);
symbol = dlsym(handle, _name);
SDL_small_free(_name, isstack);
if (!symbol) {
SDL_SetError("Failed loading %s: %s", name,
(const char *)dlerror());
}
}
return symbol;
}
void SDL_UnloadObject(SDL_SharedObject *handle)
{
if (handle) {
dlclose(handle);
}
}
#endif