34 #ifdef HAVE_MACH_O_DYLD_H
35 #include <mach-o/dyld.h>
38 #if defined(WITH_DLOPEN) && defined(ENABLE_LOADER)
39 const char* loaderOpen(
const char* aFilename,
44 static_cast<void>(dlerror());
46 *aHandle = dlopen(aFilename, RTLD_NOW);
54 const char* loaderSymbol(
void* aHandle,
58 static_cast<void>(dlerror());
60 *aPointer = dlsym(aHandle, aSymbol);
65 bool loaderClose(
void*& aHandle) {
68 rv = dlclose(aHandle) == 0;
74 #elif defined(WITH_DYLD) && defined(ENABLE_LOADER)
76 const char* loaderOpen(
const char* aFilename,
78 NSObjectFileImage ofi = 0;
79 NSObjectFileImageReturnCode ofirc;
81 ofirc = NSCreateObjectFileImageFromFile(aFilename, &ofi);
83 case NSObjectFileImageSuccess:
84 *aHandle = NSLinkModule(ofi, aFilename,
85 NSLINKMODULE_OPTION_RETURN_ON_ERROR
86 | NSLINKMODULE_OPTION_PRIVATE
87 | NSLINKMODULE_OPTION_BINDNOW);
88 NSDestroyObjectFileImage(ofi);
90 case NSObjectFileImageInappropriateFile:
92 const_cast<void*
>(
reinterpret_cast<const void*
>(NSAddImage(aFilename, NSADDIMAGE_OPTION_RETURN_ON_ERROR)));
95 return "could not open dynamic library";
102 const char* loaderSymbol(
void* aHandle,
105 int len = strlen(aSymbol);
106 char* sym =
static_cast<char*
>(malloc(len + 2));
109 snprintf(sym, len + 2,
"_%s", aSymbol);
112 if ((((
struct mach_header *)aHandle)->magic == MH_MAGIC) ||
113 (((
struct mach_header *)aHandle)->magic == MH_CIGAM)) {
114 if (NSIsSymbolNameDefinedInImage((
struct mach_header *)aHandle, sym)) {
115 nssym = (NSModule *)NSLookupSymbolInImage((
struct mach_header *)aHandle,
117 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND
118 | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
121 nssym = (NSModule *)NSLookupSymbolInModule(aHandle, sym);
128 return "symbol not found";
134 bool loaderClose(
void*& aHandle) {
143 const char* getErrorMessage() {
144 static char error[1024];
145 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, error,
sizeof(error), 0);
149 const char* loaderOpen(
const char* aFilename,
153 UINT oldErrorMode = SetErrorMode(0);
154 SetErrorMode(oldErrorMode | SEM_FAILCRITICALERRORS);
155 *aHandle = LoadLibrary(aFilename);
156 SetErrorMode(oldErrorMode);
159 rv = getErrorMessage();
164 const char* loaderSymbol(
void* aHandle,
169 *aPointer = (
void *)GetProcAddress(
static_cast<HMODULE
>(aHandle), aSymbol);
172 rv = getErrorMessage();
177 bool loaderClose(
void*& aHandle) {
180 rv = FreeLibrary(
static_cast<HMODULE
>(aHandle)) != 0;
188 const char* loaderOpen(
const char* aFilename,
191 return "dynamic loading not supported on this platform";
194 const char* loaderSymbol(
void* aHandle,
198 return "dynamic loading not supported on this platform";
201 bool loaderClose(
void*& aHandle) {