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.
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
);
87 return (PGFunction
) NSAddressOfSymbol(symbol
);
101 const char *fileName
;
102 const char *errorString
= NULL
;
104 switch (cofiff_result
)
106 case NSObjectFileImageSuccess
:
107 /* must have failed in NSLinkModule */
108 NSLinkEditError(&c
, &errorNumber
, &fileName
, &errorString
);
109 if (errorString
== NULL
|| *errorString
== '\0')
110 errorString
= "unknown link-edit failure";
112 case NSObjectFileImageFailure
:
113 errorString
= "failed to open object file";
115 case NSObjectFileImageInappropriateFile
:
116 errorString
= "inappropriate object file";
118 case NSObjectFileImageArch
:
119 errorString
= "object file is for wrong architecture";
121 case NSObjectFileImageFormat
:
122 errorString
= "object file has wrong format";
124 case NSObjectFileImageAccess
:
125 errorString
= "insufficient permissions for object file";
128 errorString
= "unknown failure to open object file";
132 return (char *) errorString
;
135 #endif /* HAVE_DLOPEN */