blob: 1a994ce15ba2e487c7cc7aa05cecb47535df066c [file] [log] [blame]
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1ae940a1995-01-02 19:04:15 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1ae940a1995-01-02 19:04:15 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1ae940a1995-01-02 19:04:15 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
30******************************************************************/
31
32/* Support for dynamic loading of extension modules */
33/* If no dynamic linking is supported, this file still generates some code! */
34
Guido van Rossum79f25d91997-04-29 20:08:16 +000035#include "Python.h"
Guido van Rossumcecadc41998-04-10 23:45:14 +000036
37#ifdef HAVE_SYS_PARAM_H
38/* osdefs.h will define MAXPATHLEN if it's not already defined. */
39#include <sys/param.h>
40#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041#include "osdefs.h"
42#include "importdl.h"
43
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044/* Explanation of some of the the various #defines used by dynamic linking...
45
46 symbol -- defined for:
47
48 DYNAMIC_LINK -- any kind of dynamic linking
Guido van Rossum75f288d1995-06-14 22:07:26 +000049 USE_RLD -- NeXT dynamic linking
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
51 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
52 _AIX -- AIX style dynamic linking
Guido van Rossum9b38a141996-09-11 23:12:24 +000053 MS_WIN32 -- Windows NT style dynamic linking (using DLLs)
54 MS_WIN16 -- Windows 16-bit dynamic linking (using DLLs)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000055 PYOS_OS2 -- IBM OS/2 dynamic linking (using DLLs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000057 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
59 LONG_EXT -- long extension, e.g. "module.so"
60 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum15af20a1998-01-19 22:03:52 +000061 __NetBSD__ -- NetBSD shared libraries
62 (assuming dlerror() was introduced between 1.2 and 1.3)
Guido van Rossum25e85291996-02-25 05:02:29 +000063 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064
65 (The other WITH_* symbols are used only once, to set the
66 appropriate symbols.)
67*/
68
69/* Configure dynamic linking */
70
Guido van Rossumff4af061996-01-12 01:17:50 +000071#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000072#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000073#define hpux
74#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000075#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000076
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077#ifdef hpux
78#define DYNAMIC_LINK
79#include <errno.h>
80typedef void (*dl_funcptr)();
81#define _DL_FUNCPTR_DEFINED 1
82#define SHORT_EXT ".sl"
83#define LONG_EXT "module.sl"
84#endif
85
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000086#if defined(PYOS_OS2)
87#define DYNAMIC_LINK
88#define INCL_DOSERRORS
89#define INCL_DOSMODULEMGR
90#include <os2.h>
91typedef int (* APIENTRY dl_funcptr)();
92#define _DL_FUNCPTR_DEFINED 1
93#define SHORT_EXT ".pyd"
94#define LONG_EXT ".dll"
95#endif
96
Guido van Rossum15af20a1998-01-19 22:03:52 +000097#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +000098#define DYNAMIC_LINK
99#define USE_SHLIB
100
101#define dlerror() "error in dynamic linking"
102#endif
103
Guido van Rossum9b38a141996-09-11 23:12:24 +0000104#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105#define DYNAMIC_LINK
106#include <windows.h>
107typedef FARPROC dl_funcptr;
108#define _DL_FUNCPTR_DEFINED
Guido van Rossum859b16c1998-05-15 20:22:08 +0000109#ifdef _DEBUG
110#define SHORT_EXT "_d.pyd"
111#define LONG_EXT "_d.dll"
112#else
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000113#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000114#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000115#endif
Guido van Rossum859b16c1998-05-15 20:22:08 +0000116#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000117
Guido van Rossum75f288d1995-06-14 22:07:26 +0000118#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119#define DYNAMIC_LINK
120#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000121#define SHORT_EXT ".so"
122#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000123#endif
124
125#ifdef WITH_SGI_DL
126#define DYNAMIC_LINK
127#define USE_DL
128#endif
129
130#ifdef WITH_DL_DLD
131#define DYNAMIC_LINK
132#define USE_DL
133#endif
134
Jack Jansen5d9acb61995-06-14 14:54:25 +0000135#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000136#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000137#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000138#ifdef __CFM68K__
139#define LONG_EXT ".CFM68K.slb"
140#else
141#define LONG_EXT ".ppc.slb"
142#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000143#ifndef _DL_FUNCPTR_DEFINED
144typedef void (*dl_funcptr)();
145#endif
146#endif
147
Guido van Rossum504f4a91996-08-20 19:59:07 +0000148#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149#define DYNAMIC_LINK
150#define USE_SHLIB
151#endif
152
153#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000154#undef USE_SHLIB /* AIX 4.2 and higher have dlfcn.h but we don't want it */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000156#define SHORT_EXT ".so"
157#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158#include <sys/ldr.h>
159typedef void (*dl_funcptr)();
160#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000161static int aix_getoldmodules(void **);
162static int aix_bindnewmodule(void *, void *);
163static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000164#endif
165
166#ifdef DYNAMIC_LINK
167
168#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000169#include <sys/types.h>
170#include <sys/stat.h>
Guido van Rossum15af20a1998-01-19 22:03:52 +0000171#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000172#include <nlist.h>
173#include <link.h>
174#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000175#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000176#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000177#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000178#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000179#ifndef _DL_FUNCPTR_DEFINED
180typedef void (*dl_funcptr)();
181#endif
182#ifndef RTLD_LAZY
183#define RTLD_LAZY 1
184#endif
Guido van Rossum08052c71997-12-02 20:43:18 +0000185#ifndef RTLD_GLOBAL
186#define RTLD_GLOBAL 0
187#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000188#define SHORT_EXT ".so"
189#define LONG_EXT "module.so"
190#endif /* USE_SHLIB */
191
192#if defined(USE_DL) || defined(hpux)
193#include "dl.h"
194#endif
195
Jack Jansen5d9acb61995-06-14 14:54:25 +0000196#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000197#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000198#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000200#define CFragConnectionID ConnectionID
201#define kLoadCFrag 0x01
202#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000203#include <Files.h>
204#include "macdefs.h"
205#include "macglue.h"
206#endif
207
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208#ifdef USE_RLD
209#include <mach-o/rld.h>
210#define FUNCNAME_PATTERN "_init%.200s"
211#ifndef _DL_FUNCPTR_DEFINED
212typedef void (*dl_funcptr)();
213#endif
214#endif /* USE_RLD */
215
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000217
218#ifndef FUNCNAME_PATTERN
Guido van Rossum1f740161998-04-13 15:27:21 +0000219#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000220#define FUNCNAME_PATTERN "_init%.200s"
221#else
222#define FUNCNAME_PATTERN "init%.200s"
223#endif
224#endif
225
226#if !defined(SHORT_EXT) && !defined(LONG_EXT)
227#define SHORT_EXT ".o"
228#define LONG_EXT "module.o"
229#endif /* !SHORT_EXT && !LONG_EXT */
230
231#endif /* DYNAMIC_LINK */
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000234#ifdef SHORT_EXT
235 {SHORT_EXT, "rb", C_EXTENSION},
236#endif /* !SHORT_EXT */
237#ifdef LONG_EXT
238 {LONG_EXT, "rb", C_EXTENSION},
239#endif /* !LONG_EXT */
240 {".py", "r", PY_SOURCE},
241 {".pyc", "rb", PY_COMPILED},
242 {0, 0}
243};
244
Guido van Rossum38234201996-07-31 17:55:19 +0000245#ifdef NO_DYNAMIC_LINK
246#undef DYNAMIC_LINK
247#endif
248
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249PyObject *
250_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000251 char *name;
252 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000253 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000254{
255#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 PyErr_SetString(PyExc_ImportError,
257 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000258 return NULL;
259#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000261 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000262 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000264#ifdef USE_SHLIB
265 static struct {
266 dev_t dev;
267 ino_t ino;
268 void *handle;
269 } handles[128];
270 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000271 char pathbuf[260];
272 if (strchr(pathname, '/') == NULL) {
273 /* Prefix bare filename with "./" */
274 sprintf(pathbuf, "./%-.255s", pathname);
275 pathname = pathbuf;
276 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000277#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
279 Py_INCREF(m);
280 return m;
281 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000282 lastdot = strrchr(name, '.');
283 if (lastdot == NULL) {
284 packagecontext = NULL;
285 shortname = name;
286 }
287 else {
288 packagecontext = name;
289 shortname = lastdot+1;
290 }
291 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000292#ifdef USE_SHLIB
293 if (fp != NULL) {
294 int i;
295 struct stat statb;
296 fstat(fileno(fp), &statb);
297 for (i = 0; i < nhandles; i++) {
298 if (statb.st_dev == handles[i].dev &&
299 statb.st_ino == handles[i].ino) {
300 p = (dl_funcptr) dlsym(handles[i].handle,
301 funcname);
302 goto got_it;
303 }
304 }
305 if (nhandles < 128) {
306 handles[nhandles].dev = statb.st_dev;
307 handles[nhandles].ino = statb.st_ino;
308 }
309 }
310#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000311#ifdef USE_MAC_DYNAMIC_LOADING
312 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 ** Dynamic loading of CFM shared libraries on the Mac. The
314 ** code has become more convoluted than it was, because we
315 ** want to be able to put multiple modules in a single
316 ** file. For this reason, we have to determine the fragment
317 ** name, and we cannot use the library entry point but we have
318 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000319 */
Jack Jansen4e043731995-02-13 22:42:34 +0000320 {
321 FSSpec libspec;
322 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000323 Ptr mainAddr;
324 Str255 errMessage;
325 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000326 Boolean isfolder, didsomething;
327 char buf[512];
328 Str63 fragname;
329 Ptr symAddr;
330 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000331
Jack Jansen5d9acb61995-06-14 14:54:25 +0000332 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000333 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000334 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
335 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000336 sprintf(buf, "%.255s: %.200s",
337 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000339 return NULL;
340 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 /* Next, determine the fragment name,
342 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000343 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
344 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 if( strncmp((char *)(fragname+1+fragname[0]-4),
346 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000347 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 if ( strncmp((char *)(fragname+1+fragname[0]-6),
349 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000350 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 /* Load the fragment
352 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000353 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000354 kLoadCFrag, &connID, &mainAddr,
355 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000356 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000357 sprintf(buf, "%.*s: %.200s",
358 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000359 PyMac_StrError(err));
360 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000361 return NULL;
362 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000363 /* Locate the address of the correct init function */
364 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
365 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000366 sprintf(buf, "%s: %.200s",
367 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000369 return NULL;
370 }
371 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000372 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000373#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374#ifdef USE_SHLIB
375 {
376#ifdef RTLD_NOW
377 /* RTLD_NOW: resolve externals now
378 (i.e. core dump now if some are missing) */
Guido van Rossum08052c71997-12-02 20:43:18 +0000379 void *handle = dlopen(pathname, RTLD_NOW | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380#else
381 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 if (Py_VerboseFlag)
Guido van Rossum08052c71997-12-02 20:43:18 +0000383 printf("dlopen(\"%s\", %d);\n", pathname,
384 RTLD_LAZY | RTLD_GLOBAL);
385 handle = dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386#endif /* RTLD_NOW */
387 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389 return NULL;
390 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000391 if (fp != NULL && nhandles < 128)
392 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 p = (dl_funcptr) dlsym(handle, funcname);
394 }
395#endif /* USE_SHLIB */
396#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000397 /*
398 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
399 -- of the shared module unresolved. Thus we have to resolve them
400 -- explicitely with loadbind. The new module is loaded, then we
401 -- resolve its symbols using the list of already loaded modules
402 -- (only those that belong to the python executable). Get these
403 -- with loadquery(L_GETINFO).
404 */
405 {
406 static void *staticmodlistptr = NULL;
407
408 if (!staticmodlistptr)
409 if (aix_getoldmodules(&staticmodlistptr) == -1)
410 return NULL;
411 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
412 if (p == NULL) {
413 aix_loaderror(pathname);
414 return NULL;
415 }
416 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
417 aix_loaderror(pathname);
418 return NULL;
419 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420 }
421#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000422#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 {
424 HINSTANCE hDLL;
425 hDLL = LoadLibrary(pathname);
426 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000427 char errBuf[256];
428 unsigned int errorCode;
429
430 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 char theInfo[256]; /* Pointer to error text
432 from system */
433 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000434
435 errorCode = GetLastError();
436
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 theLength = FormatMessage(
438 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
439 NULL, /* message source */
440 errorCode, /* the message (error) ID */
441 0, /* default language environment */
442 (LPTSTR) theInfo, /* the buffer */
443 sizeof(theInfo), /* the buffer size */
444 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000445
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 /* Problem: could not get the error message.
447 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000448 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 sprintf(errBuf,
450 "DLL load failed with error code %d",
451 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000452 } else {
453 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 /* For some reason a \r\n
455 is appended to the text */
456 if (theLength >= 2 &&
457 theInfo[theLength-2] == '\r' &&
458 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000459 theLength -= 2;
460 theInfo[theLength] = '\0';
461 }
462 strcpy(errBuf, "DLL load failed: ");
463 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 strncpy(errBuf+len, theInfo,
465 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000466 errBuf[sizeof(errBuf)-1] = '\0';
467 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469 return NULL;
470 }
471 p = GetProcAddress(hDLL, funcname);
472 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000473#endif /* MS_WIN32 */
474#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000475 {
476 HINSTANCE hDLL;
477 hDLL = LoadLibrary(pathname);
478 if (hDLL < HINSTANCE_ERROR){
479 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 sprintf(errBuf,
481 "DLL load failed with error code %d", hDLL);
482 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000483 return NULL;
484 }
485 p = GetProcAddress(hDLL, funcname);
486 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000487#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000488
489#if defined(PYOS_OS2)
490 {
491 APIRET rc;
492 HMODULE hDLL;
493 char failreason[256];
494
495 rc = DosLoadModule(failreason,
496 sizeof(failreason),
497 pathname,
498 &hDLL);
499
500 if (rc != NO_ERROR) {
501 char errBuf[256];
502 sprintf(errBuf,
503 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
504 PyErr_SetString(PyExc_ImportError, errBuf);
505 return NULL;
506 }
507
508 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
509 if (rc != NO_ERROR)
510 p = NULL; /* Signify Failure to Acquire Entrypoint */
511 }
512#endif /* PYOS_OS2 */
513
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516#endif /* USE_DL */
517#ifdef USE_RLD
518 {
519 NXStream *errorStream;
520 struct mach_header *new_header;
521 const char *filenames[2];
522 long ret;
523 unsigned long ptr;
524
525 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
526 filenames[0] = pathname;
527 filenames[1] = NULL;
528 ret = rld_load(errorStream, &new_header,
529 filenames, NULL);
530
531 /* extract the error messages for the exception */
532 if(!ret) {
533 char *streamBuf;
534 int len, maxLen;
535
536 NXPutc(errorStream, (char)0);
537
538 NXGetMemoryBuffer(errorStream,
539 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541 }
542
543 if(ret && rld_lookup(errorStream, funcname, &ptr))
544 p = (dl_funcptr) ptr;
545
546 NXCloseMemory(errorStream, NX_FREEBUFFER);
547
548 if(!ret)
549 return NULL;
550 }
551#endif /* USE_RLD */
552#ifdef hpux
553 {
554 shl_t lib;
555 int flags;
556
Guido van Rossum3afb5951996-12-05 23:15:35 +0000557 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
561 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000562 printf("shl_load %s\n",pathname);
563 }
564 lib = shl_load(pathname, flags, 0);
565 if (lib == NULL)
566 {
567 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569 perror(pathname);
570 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 return NULL;
573 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575 printf("shl_findsym %s\n", funcname);
576 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 perror(funcname);
579 }
580#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000581#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000582 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000583#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000584 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000585 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000586 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000587 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588 return NULL;
589 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000590 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000592 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000593 if (PyErr_Occurred())
594 return NULL;
595 if (_PyImport_FixupExtension(name, pathname) == NULL)
596 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000598 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600 PyErr_SetString(PyExc_SystemError,
601 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602 return NULL;
603 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000604 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 d = PyModule_GetDict(m);
606 s = PyString_FromString(pathname);
607 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
608 PyErr_Clear(); /* Not important enough to report */
609 Py_XDECREF(s);
610 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611 fprintf(stderr,
612 "import %s # dynamically loaded from %s\n",
613 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615 return m;
616#endif /* DYNAMIC_LINK */
617}
618
619
620#ifdef _AIX
621
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000622#include <ctype.h> /* for isdigit() */
623#include <errno.h> /* for global errno */
624#include <string.h> /* for strerror() */
625#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000627typedef struct Module {
628 struct Module *next;
629 void *entry;
630} Module, *ModulePtr;
631
632static int
633aix_getoldmodules(modlistptr)
634 void **modlistptr;
635{
636 register ModulePtr modptr, prevmodptr;
637 register struct ld_info *ldiptr;
638 register char *ldibuf;
639 register int errflag, bufsize = 1024;
640 register unsigned int offset;
641
642 /*
643 -- Get the list of loaded modules into ld_info structures.
644 */
645 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000647 return -1;
648 }
649 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
650 && errno == ENOMEM) {
651 free(ldibuf);
652 bufsize += 1024;
653 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000655 return -1;
656 }
657 }
658 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000660 return -1;
661 }
662 /*
663 -- Make the modules list from the ld_info structures.
664 */
665 ldiptr = (struct ld_info *)ldibuf;
666 prevmodptr = NULL;
667 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000668 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
669 /*
670 -- Extract only the modules containing "python" as a
671 -- substring, like the "python[version]" executable or
672 -- "libpython[version].a" in case python is embedded.
673 */
674 offset = (unsigned int)ldiptr->ldinfo_next;
675 ldiptr = (struct ld_info *)((unsigned int)
676 ldiptr + offset);
677 continue;
678 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000679 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000681 while (*modlistptr) {
682 modptr = (ModulePtr)*modlistptr;
683 *modlistptr = (void *)modptr->next;
684 free(modptr);
685 }
686 return -1;
687 }
688 modptr->entry = ldiptr->ldinfo_dataorg;
689 modptr->next = NULL;
690 if (prevmodptr == NULL)
691 *modlistptr = (void *)modptr;
692 else
693 prevmodptr->next = modptr;
694 prevmodptr = modptr;
695 offset = (unsigned int)ldiptr->ldinfo_next;
696 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
697 } while (offset);
698 free(ldibuf);
699 return 0;
700}
701
702static int
703aix_bindnewmodule(newmoduleptr, modlistptr)
704 void *newmoduleptr;
705 void *modlistptr;
706{
707 register ModulePtr modptr;
708
709 /*
710 -- Bind the new module with the list of loaded modules.
711 */
712 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
713 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
714 return -1;
715 return 0;
716}
717
718static void
719aix_loaderror(pathname)
720 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721{
722
Guido van Rossum236f62d1996-06-26 21:07:08 +0000723 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000724 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725
726 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000727 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728 char *errstr;
729 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000730 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731 {L_ERROR_NOLIB, "can't load library:"},
732 {L_ERROR_UNDEF, "can't find symbol in library:"},
733 {L_ERROR_RLDBAD,
734 "RLD index out of range or bad relocation type:"},
735 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
736 {L_ERROR_MEMBER,
737 "file not an archive or does not contain requested member:"},
738 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000739 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 {L_ERROR_SYSTEM, "System error:"},
741 {L_ERROR_ERRNO, NULL}
742 };
743
744#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
745#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
746
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000747 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000749 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000751 ERRBUF_APPEND("\n");
752 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 for(i = 0; message[i] && *message[i]; i++) {
754 int nerr = atoi(message[i]);
755 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000756 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000757 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 }
759 while (isdigit(*message[i])) message[i]++ ;
760 ERRBUF_APPEND(message[i]);
761 ERRBUF_APPEND("\n");
762 }
763 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765 return;
766}
767
768#endif /* _AIX */