2 * Dynamic loading support for Darwin
4 * If dlopen() is available (Darwin 10.3 and later), we just use it.
5 * Otherwise we emulate it with the older, now deprecated, NSLinkModule API.
7 * $PostgreSQL: pgsql/src/backend/port/dynloader/darwin.c,v 1.12 2007/11/15 21:14:37 momjian Exp $
14 #include <mach-o/dyld.h>
17 #include "dynloader.h"
23 pg_dlopen(char *filename)
25 return dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
29 pg_dlclose(void *handle)
35 pg_dlsym(void *handle, char *funcname)
37 /* Do not prepend an underscore: see dlopen(3) */
38 return dlsym(handle, funcname);
46 #else /* !HAVE_DLOPEN */
49 * These routines were taken from the Apache source, but were made
50 * available with a PostgreSQL-compatible license. Kudos Wilfredo
51 * Sánchez <wsanchez@apple.com>.
54 static NSObjectFileImageReturnCode cofiff_result = NSObjectFileImageFailure;
57 pg_dlopen(char *filename)
59 NSObjectFileImage image;
61 cofiff_result = NSCreateObjectFileImageFromFile(filename, &image);
62 if (cofiff_result != NSObjectFileImageSuccess)
64 return NSLinkModule(image, filename,
65 NSLINKMODULE_OPTION_BINDNOW |
66 NSLINKMODULE_OPTION_RETURN_ON_ERROR);
70 pg_dlclose(void *handle)
72 NSUnLinkModule(handle, FALSE);
76 pg_dlsym(void *handle, char *funcname)
79 char *symname = (char *) malloc(strlen(funcname) + 2);
81 sprintf(symname, "_%s", funcname);
82 if (NSIsSymbolNameDefined(symname))
84 symbol = NSLookupAndBindSymbol(symname);
86 return (PGFunction) NSAddressOfSymbol(symbol);
100 const char *fileName;
101 const char *errorString = NULL;
103 switch (cofiff_result)
105 case NSObjectFileImageSuccess:
106 /* must have failed in NSLinkModule */
107 NSLinkEditError(&c, &errorNumber, &fileName, &errorString);
108 if (errorString == NULL || *errorString == '\0')
109 errorString = "unknown link-edit failure";
111 case NSObjectFileImageFailure:
112 errorString = "failed to open object file";
114 case NSObjectFileImageInappropriateFile:
115 errorString = "inappropriate object file";
117 case NSObjectFileImageArch:
118 errorString = "object file is for wrong architecture";
120 case NSObjectFileImageFormat:
121 errorString = "object file has wrong format";
123 case NSObjectFileImageAccess:
124 errorString = "insufficient permissions for object file";
127 errorString = "unknown failure to open object file";
131 return (char *) errorString;
134 #endif /* HAVE_DLOPEN */