diff options
-rw-r--r-- | Python/dynload_aix.c | 2 | ||||
-rw-r--r-- | Python/dynload_beos.c | 6 | ||||
-rw-r--r-- | Python/dynload_dl.c | 5 | ||||
-rw-r--r-- | Python/dynload_hpux.c | 9 | ||||
-rw-r--r-- | Python/dynload_mac.c | 4 | ||||
-rw-r--r-- | Python/dynload_next.c | 5 | ||||
-rw-r--r-- | Python/dynload_os2.c | 4 | ||||
-rw-r--r-- | Python/dynload_shlib.c | 13 | ||||
-rw-r--r-- | Python/dynload_win.c | 5 | ||||
-rw-r--r-- | Python/import.c | 8 | ||||
-rw-r--r-- | Python/importdl.c | 78 |
11 files changed, 64 insertions, 75 deletions
diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index f8f431754d..0e271521aa 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -202,7 +202,7 @@ aix_loaderror(pathname) } -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; diff --git a/Python/dynload_beos.c b/Python/dynload_beos.c index 4b4a49a57d..717d5a9510 100644 --- a/Python/dynload_beos.c +++ b/Python/dynload_beos.c @@ -185,13 +185,14 @@ static void beos_add_dyn( char *name, image_id id ) -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; image_id the_id; status_t retval; char fullpath[PATH_MAX]; + char funcname[258]; if( Py_VerboseFlag ) { printf( "load_add_on( %s )\n", pathname ); @@ -236,6 +237,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, return NULL; } + sprintf(funcname, "init%.200s", shortname); if( Py_VerboseFlag ) { printf( "get_image_symbol( %s )\n", funcname ); } @@ -274,7 +276,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, /* Save the module name and image ID for later so we can clean up * gracefully. */ - beos_add_dyn( name, the_id ); + beos_add_dyn( fqname, the_id ); return p; } diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c index 3b445ceb4f..45dcff740a 100644 --- a/Python/dynload_dl.c +++ b/Python/dynload_dl.c @@ -46,8 +46,11 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { + char funcname[258]; + + sprintf(funcname, "init%.200s", shortname); return dl_loadmod(Py_GetProgramName(), pathname, funcname); } diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index 4379cbee21..b8a5ffce23 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -37,6 +37,11 @@ PERFORMANCE OF THIS SOFTWARE. #include "Python.h" #include "importdl.h" +#if defined(__hp9000s300) +#define FUNCNAME_PATTERN "_init%.200s" +#else +#define FUNCNAME_PATTERN "init%.200s" +#endif const struct filedescr _PyImport_DynLoadFiletab[] = { {".sl", "rb", C_EXTENSION}, @@ -44,12 +49,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {0, 0} }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; shl_t lib; int flags; + char funcname[258]; flags = BIND_FIRST | BIND_DEFERRED; if (Py_VerboseFlag) { @@ -67,6 +73,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, PyErr_SetString(PyExc_ImportError, buf); return NULL; } + sprintf(funcname, FUNCNAME_PATTERN, shortname); if (Py_VerboseFlag) printf("shl_findsym %s\n", funcname); shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p); diff --git a/Python/dynload_mac.c b/Python/dynload_mac.c index 91619956e9..58c57d5074 100644 --- a/Python/dynload_mac.c +++ b/Python/dynload_mac.c @@ -59,10 +59,11 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; + char funcname[258]; /* ** Dynamic loading of CFM shared libraries on the Mac. The @@ -121,6 +122,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, return NULL; } /* Locate the address of the correct init function */ + sprintf(funcname, "init%.200s", shortname); err = FindSymbol(connID, Pstring(funcname), &symAddr, &class); if ( err ) { sprintf(buf, "%s: %.200s", diff --git a/Python/dynload_next.c b/Python/dynload_next.c index bcb9e4bb37..5088b059d8 100644 --- a/Python/dynload_next.c +++ b/Python/dynload_next.c @@ -68,10 +68,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {0, 0} }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p = NULL; + char funcname[258]; + + sprintf(funcname, "_init%.200s", shortname); #ifdef USE_RLD { diff --git a/Python/dynload_os2.c b/Python/dynload_os2.c index 6090c3300b..528e7dc600 100644 --- a/Python/dynload_os2.c +++ b/Python/dynload_os2.c @@ -45,13 +45,14 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {0, 0} }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; APIRET rc; HMODULE hDLL; char failreason[256]; + char funcname[258]; rc = DosLoadModule(failreason, sizeof(failreason), @@ -67,6 +68,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, return NULL; } + sprintf(funcname, "init%.200s", shortname); rc = DosQueryProcAddr(hDLL, 0L, funcname, &p); if (rc != NO_ERROR) p = NULL; /* Signify Failure to Acquire Entrypoint */ diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index d3c5a6ee34..2823bbbd5a 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -65,11 +65,22 @@ static struct { static int nhandles = 0; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; void *handle; + char funcname[258]; + char pathbuf[260]; + + if (strchr(pathname, '/') == NULL) { + /* Prefix bare filename with "./" */ + sprintf(pathbuf, "./%-.255s", pathname); + pathname = pathbuf; + } + + /* ### should there be a leading underscore for some platforms? */ + sprintf(funcname, "init%.200s", shortname); if (fp != NULL) { int i; diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 9e68cac35d..08a2a895fe 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -49,10 +49,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { }; -dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; + char funcname[258]; + + sprintf(funcname, "init%.200s", shortname); #ifdef MS_WIN32 { diff --git a/Python/import.c b/Python/import.c index e10463b288..bce1b57888 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1234,9 +1234,11 @@ load_module(name, fp, buf, type) m = load_compiled_module(name, buf, fp); break; +#ifdef HAVE_DYNAMIC_LOADING case C_EXTENSION: m = _PyImport_LoadDynamicModule(name, buf, fp); break; +#endif #ifdef macintosh case PY_RESOURCE: @@ -2158,6 +2160,8 @@ imp_load_compiled(self, args) return m; } +#ifdef HAVE_DYNAMIC_LOADING + static PyObject * imp_load_dynamic(self, args) PyObject *self; @@ -2180,6 +2184,8 @@ imp_load_dynamic(self, args) return m; } +#endif /* HAVE_DYNAMIC_LOADING */ + static PyObject * imp_load_source(self, args) PyObject *self; @@ -2330,7 +2336,9 @@ static PyMethodDef imp_methods[] = { {"is_builtin", imp_is_builtin, 1}, {"is_frozen", imp_is_frozen, 1}, {"load_compiled", imp_load_compiled, 1}, +#ifdef HAVE_DYNAMIC_LOADING {"load_dynamic", imp_load_dynamic, 1}, +#endif {"load_package", imp_load_package, 1}, #ifdef macintosh {"load_resource", imp_load_resource, 1}, diff --git a/Python/importdl.c b/Python/importdl.c index 6b3eccc98f..8dd14b8602 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -30,59 +30,22 @@ PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* Support for dynamic loading of extension modules */ -/* If no dynamic linking is supported, this file still generates some code! */ #include "Python.h" -#include "importdl.h" - -/* Explanation of some of the the various #defines used by dynamic linking... - symbol -- defined for: - - HAVE_DYNAMIC_LOADING -- any kind of dynamic linking (from ./configure) - USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries - _AIX -- AIX style dynamic linking - __NetBSD__ -- NetBSD shared libraries - (assuming dlerror() was introduced between 1.2 and 1.3) - __BEOS__ -- BeOS shared libraries - defined by the compiler +/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is + supported on this platform. configure will then compile and link in one + of the dynload_*.c files, as appropriate. We will call a function in + those modules to get a function pointer to the module's init function. */ - -/* Configure dynamic linking */ - #ifdef HAVE_DYNAMIC_LOADING +#include "importdl.h" + extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name, - const char *funcname, + const char *shortname, const char *pathname, FILE *fp); -/* ### given NeXT, is WITH_DYLD not necessary? */ - -#if defined(__hp9000s300) || (defined(__NetBSD__) || defined(__FreeBSD__)) && !defined(__ELF__) || defined(__OpenBSD__) || defined(__BORLANDC__) || defined(NeXT) || defined(WITH_DYLD) -#define FUNCNAME_PATTERN "_init%.200s" -#else -#define FUNCNAME_PATTERN "init%.200s" -#endif - -/* ### temporary, for setting USE_SHLIB */ -#if defined(__NetBSD__) && (NetBSD < 199712) -#define USE_SHLIB -#else -#if defined(HAVE_DLOPEN) || defined(M_UNIX) -#define USE_SHLIB -#endif -#endif -#ifdef _AIX -#undef USE_SHLIB -#endif -#ifdef __BEOS__ -#undef USE_SHLIB -#endif - -#endif /* HAVE_DYNAMIC_LOADING */ - -#ifdef NO_DYNAMIC_LINK -#undef HAVE_DYNAMIC_LOADING -#endif PyObject * @@ -91,24 +54,9 @@ _PyImport_LoadDynamicModule(name, pathname, fp) char *pathname; FILE *fp; { -#ifndef HAVE_DYNAMIC_LOADING - PyErr_SetString(PyExc_ImportError, - "dynamically linked modules not supported"); - return NULL; -#else PyObject *m, *d, *s; - char funcname[258]; char *lastdot, *shortname, *packagecontext; - dl_funcptr p = NULL; - -#ifdef USE_SHLIB - char pathbuf[260]; - if (strchr(pathname, '/') == NULL) { - /* Prefix bare filename with "./" */ - sprintf(pathbuf, "./%-.255s", pathname); - pathname = pathbuf; - } -#endif /* USE_SHLIB */ + dl_funcptr p; if ((m = _PyImport_FindExtension(name, pathname)) != NULL) { Py_INCREF(m); @@ -123,15 +71,14 @@ _PyImport_LoadDynamicModule(name, pathname, fp) packagecontext = name; shortname = lastdot+1; } - sprintf(funcname, FUNCNAME_PATTERN, shortname); - p = _PyImport_GetDynLoadFunc(name, funcname, pathname, fp); + p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp); if (PyErr_Occurred()) return NULL; if (p == NULL) { PyErr_Format(PyExc_ImportError, - "dynamic module does not define init function (%.200s)", - funcname); + "dynamic module does not define init function (init%.200s)", + shortname); return NULL; } _Py_PackageContext = packagecontext; @@ -160,5 +107,6 @@ _PyImport_LoadDynamicModule(name, pathname, fp) name, pathname); Py_INCREF(m); return m; -#endif /* HAVE_DYNAMIC_LOADING */ } + +#endif /* HAVE_DYNAMIC_LOADING */ |