summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Python/dynload_aix.c2
-rw-r--r--Python/dynload_beos.c6
-rw-r--r--Python/dynload_dl.c5
-rw-r--r--Python/dynload_hpux.c9
-rw-r--r--Python/dynload_mac.c4
-rw-r--r--Python/dynload_next.c5
-rw-r--r--Python/dynload_os2.c4
-rw-r--r--Python/dynload_shlib.c13
-rw-r--r--Python/dynload_win.c5
-rw-r--r--Python/import.c8
-rw-r--r--Python/importdl.c78
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 */