2
/* Support for dynamic loading of extension modules on Mac OS X
3
** All references to "NeXT" are for historical reasons.
9
#include <mach-o/dyld.h>
11
const struct filedescr _PyImport_DynLoadFiletab[] = {
12
{".so", "rb", C_EXTENSION},
13
{"module.so", "rb", C_EXTENSION},
18
** Python modules are Mach-O MH_BUNDLE files. The best way to load these
19
** is each in a private namespace, so you can load, say, a module bar and a
20
** module foo.bar. If we load everything in the global namespace the two
21
** initbar() symbols will conflict.
22
** However, it seems some extension packages depend upon being able to access
23
** each others' global symbols. There seems to be no way to eat our cake and
24
** have it, so the USE_DYLD_GLOBAL_NAMESPACE define determines which behaviour
28
#ifdef USE_DYLD_GLOBAL_NAMESPACE
29
#define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR
31
#define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \
32
NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE
34
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
35
const char *pathname, FILE *fp)
39
NSObjectFileImageReturnCode rc;
40
NSObjectFileImage image;
43
const char *errString;
46
PyOS_snprintf(funcname, sizeof(funcname), "_PyInit_%.200s", shortname);
48
#ifdef USE_DYLD_GLOBAL_NAMESPACE
49
if (NSIsSymbolNameDefined(funcname)) {
50
theSym = NSLookupAndBindSymbol(funcname);
51
p = (dl_funcptr)NSAddressOfSymbol(theSym);
55
rc = NSCreateObjectFileImageFromFile(pathname, &image);
58
case NSObjectFileImageFailure:
59
case NSObjectFileImageFormat:
60
/* for these a message is printed on stderr by dyld */
61
errString = "Can't create object file image";
63
case NSObjectFileImageSuccess:
66
case NSObjectFileImageInappropriateFile:
67
errString = "Inappropriate file type for dynamic loading";
69
case NSObjectFileImageArch:
70
errString = "Wrong CPU type in object file";
72
case NSObjectFileImageAccess:
73
errString = "Can't read object file (no access)";
76
if (errString == NULL) {
77
newModule = NSLinkModule(image, pathname, LINKOPTIONS);
78
if (newModule == NULL) {
80
const char *fileName, *moreErrorStr;
82
NSLinkEditError( &c, &errNo, &fileName, &moreErrorStr );
83
PyOS_snprintf(errBuf, 512, "Failure linking new module: %s: %s",
84
fileName, moreErrorStr);
88
if (errString != NULL) {
89
PyErr_SetString(PyExc_ImportError, errString);
92
#ifdef USE_DYLD_GLOBAL_NAMESPACE
93
if (!NSIsSymbolNameDefined(funcname)) {
94
/* UnlinkModule() isn't implemented in current versions, but calling it does no harm */
95
/* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */
96
PyErr_Format(PyExc_ImportError,
97
"Loaded module does not contain symbol %.200s",
101
theSym = NSLookupAndBindSymbol(funcname);
103
theSym = NSLookupSymbolInModule(newModule, funcname);
104
if ( theSym == NULL ) {
105
/* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */
106
PyErr_Format(PyExc_ImportError,
107
"Loaded module does not contain symbol %.200s",
112
p = (dl_funcptr)NSAddressOfSymbol(theSym);