blob: 477b1048456f0e7cb14aaa268bcdf6a60f3b57be [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 Rossum1ae940a1995-01-02 19:04:15 +000036#include "osdefs.h"
37#include "importdl.h"
38
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* Explanation of some of the the various #defines used by dynamic linking...
40
41 symbol -- defined for:
42
43 DYNAMIC_LINK -- any kind of dynamic linking
Guido van Rossum75f288d1995-06-14 22:07:26 +000044 USE_RLD -- NeXT dynamic linking
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
46 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
47 _AIX -- AIX style dynamic linking
Guido van Rossum9b38a141996-09-11 23:12:24 +000048 MS_WIN32 -- Windows NT style dynamic linking (using DLLs)
49 MS_WIN16 -- Windows 16-bit dynamic linking (using DLLs)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000050 PYOS_OS2 -- IBM OS/2 dynamic linking (using DLLs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000052 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
54 LONG_EXT -- long extension, e.g. "module.so"
55 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum46c76a61995-01-20 16:53:54 +000056 __NetBSD__ -- NetBSD shared libraries (not quite SVR4 compatible)
Guido van Rossum25e85291996-02-25 05:02:29 +000057 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058
59 (The other WITH_* symbols are used only once, to set the
60 appropriate symbols.)
61*/
62
63/* Configure dynamic linking */
64
Guido van Rossumff4af061996-01-12 01:17:50 +000065#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000066#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000067#define hpux
68#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000069#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000070
Guido van Rossum1ae940a1995-01-02 19:04:15 +000071#ifdef hpux
72#define DYNAMIC_LINK
73#include <errno.h>
74typedef void (*dl_funcptr)();
75#define _DL_FUNCPTR_DEFINED 1
76#define SHORT_EXT ".sl"
77#define LONG_EXT "module.sl"
78#endif
79
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000080#if defined(PYOS_OS2)
81#define DYNAMIC_LINK
82#define INCL_DOSERRORS
83#define INCL_DOSMODULEMGR
84#include <os2.h>
85typedef int (* APIENTRY dl_funcptr)();
86#define _DL_FUNCPTR_DEFINED 1
87#define SHORT_EXT ".pyd"
88#define LONG_EXT ".dll"
89#endif
90
Guido van Rossum9218b701997-05-05 15:03:26 +000091#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +000092#define DYNAMIC_LINK
93#define USE_SHLIB
94
95#define dlerror() "error in dynamic linking"
96#endif
97
Guido van Rossum9b38a141996-09-11 23:12:24 +000098#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099#define DYNAMIC_LINK
100#include <windows.h>
101typedef FARPROC dl_funcptr;
102#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000103#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000104#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105#endif
106
Guido van Rossum75f288d1995-06-14 22:07:26 +0000107#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000108#define DYNAMIC_LINK
109#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000110#define SHORT_EXT ".so"
111#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000112#endif
113
114#ifdef WITH_SGI_DL
115#define DYNAMIC_LINK
116#define USE_DL
117#endif
118
119#ifdef WITH_DL_DLD
120#define DYNAMIC_LINK
121#define USE_DL
122#endif
123
Jack Jansen5d9acb61995-06-14 14:54:25 +0000124#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000125#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000126#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000127#ifdef __CFM68K__
128#define LONG_EXT ".CFM68K.slb"
129#else
130#define LONG_EXT ".ppc.slb"
131#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000132#ifndef _DL_FUNCPTR_DEFINED
133typedef void (*dl_funcptr)();
134#endif
135#endif
136
Guido van Rossum504f4a91996-08-20 19:59:07 +0000137#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138#define DYNAMIC_LINK
139#define USE_SHLIB
140#endif
141
142#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000143#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 +0000144#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000145#define SHORT_EXT ".so"
146#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147#include <sys/ldr.h>
148typedef void (*dl_funcptr)();
149#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000150static int aix_getoldmodules(void **);
151static int aix_bindnewmodule(void *, void *);
152static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#endif
154
155#ifdef DYNAMIC_LINK
156
157#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000158#include <sys/types.h>
159#include <sys/stat.h>
Guido van Rossum9218b701997-05-05 15:03:26 +0000160#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000161#include <nlist.h>
162#include <link.h>
163#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000164#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000166#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000167#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000168#ifndef _DL_FUNCPTR_DEFINED
169typedef void (*dl_funcptr)();
170#endif
171#ifndef RTLD_LAZY
172#define RTLD_LAZY 1
173#endif
Guido van Rossum08052c71997-12-02 20:43:18 +0000174#ifndef RTLD_GLOBAL
175#define RTLD_GLOBAL 0
176#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000177#define SHORT_EXT ".so"
178#define LONG_EXT "module.so"
179#endif /* USE_SHLIB */
180
181#if defined(USE_DL) || defined(hpux)
182#include "dl.h"
183#endif
184
Jack Jansen5d9acb61995-06-14 14:54:25 +0000185#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000186#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000187#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000189#define CFragConnectionID ConnectionID
190#define kLoadCFrag 0x01
191#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000192#include <Files.h>
193#include "macdefs.h"
194#include "macglue.h"
195#endif
196
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000197#ifdef USE_RLD
198#include <mach-o/rld.h>
199#define FUNCNAME_PATTERN "_init%.200s"
200#ifndef _DL_FUNCPTR_DEFINED
201typedef void (*dl_funcptr)();
202#endif
203#endif /* USE_RLD */
204
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000206
207#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000208#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000209#define FUNCNAME_PATTERN "_init%.200s"
210#else
211#define FUNCNAME_PATTERN "init%.200s"
212#endif
213#endif
214
215#if !defined(SHORT_EXT) && !defined(LONG_EXT)
216#define SHORT_EXT ".o"
217#define LONG_EXT "module.o"
218#endif /* !SHORT_EXT && !LONG_EXT */
219
220#endif /* DYNAMIC_LINK */
221
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000223#ifdef SHORT_EXT
224 {SHORT_EXT, "rb", C_EXTENSION},
225#endif /* !SHORT_EXT */
226#ifdef LONG_EXT
227 {LONG_EXT, "rb", C_EXTENSION},
228#endif /* !LONG_EXT */
229 {".py", "r", PY_SOURCE},
230 {".pyc", "rb", PY_COMPILED},
231 {0, 0}
232};
233
Guido van Rossum38234201996-07-31 17:55:19 +0000234#ifdef NO_DYNAMIC_LINK
235#undef DYNAMIC_LINK
236#endif
237
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238PyObject *
239_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000240 char *name;
241 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000242 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000243{
244#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyErr_SetString(PyExc_ImportError,
246 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000247 return NULL;
248#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000250 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000251 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000253#ifdef USE_SHLIB
254 static struct {
255 dev_t dev;
256 ino_t ino;
257 void *handle;
258 } handles[128];
259 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000260 char pathbuf[260];
261 if (strchr(pathname, '/') == NULL) {
262 /* Prefix bare filename with "./" */
263 sprintf(pathbuf, "./%-.255s", pathname);
264 pathname = pathbuf;
265 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000266#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
268 Py_INCREF(m);
269 return m;
270 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000271 lastdot = strrchr(name, '.');
272 if (lastdot == NULL) {
273 packagecontext = NULL;
274 shortname = name;
275 }
276 else {
277 packagecontext = name;
278 shortname = lastdot+1;
279 }
280 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000281#ifdef USE_SHLIB
282 if (fp != NULL) {
283 int i;
284 struct stat statb;
285 fstat(fileno(fp), &statb);
286 for (i = 0; i < nhandles; i++) {
287 if (statb.st_dev == handles[i].dev &&
288 statb.st_ino == handles[i].ino) {
289 p = (dl_funcptr) dlsym(handles[i].handle,
290 funcname);
291 goto got_it;
292 }
293 }
294 if (nhandles < 128) {
295 handles[nhandles].dev = statb.st_dev;
296 handles[nhandles].ino = statb.st_ino;
297 }
298 }
299#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000300#ifdef USE_MAC_DYNAMIC_LOADING
301 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 ** Dynamic loading of CFM shared libraries on the Mac. The
303 ** code has become more convoluted than it was, because we
304 ** want to be able to put multiple modules in a single
305 ** file. For this reason, we have to determine the fragment
306 ** name, and we cannot use the library entry point but we have
307 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000308 */
Jack Jansen4e043731995-02-13 22:42:34 +0000309 {
310 FSSpec libspec;
311 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000312 Ptr mainAddr;
313 Str255 errMessage;
314 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000315 Boolean isfolder, didsomething;
316 char buf[512];
317 Str63 fragname;
318 Ptr symAddr;
319 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000320
Jack Jansen5d9acb61995-06-14 14:54:25 +0000321 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000322 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000323 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
324 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000325 sprintf(buf, "%.255s: %.200s",
326 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000328 return NULL;
329 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 /* Next, determine the fragment name,
331 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000332 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
333 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 if( strncmp((char *)(fragname+1+fragname[0]-4),
335 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000336 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 if ( strncmp((char *)(fragname+1+fragname[0]-6),
338 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000339 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 /* Load the fragment
341 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000342 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000343 kLoadCFrag, &connID, &mainAddr,
344 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000345 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000346 sprintf(buf, "%.*s: %.200s",
347 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 PyMac_StrError(err));
349 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000350 return NULL;
351 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000352 /* Locate the address of the correct init function */
353 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
354 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000355 sprintf(buf, "%s: %.200s",
356 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000358 return NULL;
359 }
360 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000361 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000362#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000363#ifdef USE_SHLIB
364 {
365#ifdef RTLD_NOW
366 /* RTLD_NOW: resolve externals now
367 (i.e. core dump now if some are missing) */
Guido van Rossum08052c71997-12-02 20:43:18 +0000368 void *handle = dlopen(pathname, RTLD_NOW | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369#else
370 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 if (Py_VerboseFlag)
Guido van Rossum08052c71997-12-02 20:43:18 +0000372 printf("dlopen(\"%s\", %d);\n", pathname,
373 RTLD_LAZY | RTLD_GLOBAL);
374 handle = dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375#endif /* RTLD_NOW */
376 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 return NULL;
379 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000380 if (fp != NULL && nhandles < 128)
381 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382 p = (dl_funcptr) dlsym(handle, funcname);
383 }
384#endif /* USE_SHLIB */
385#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000386 /*
387 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
388 -- of the shared module unresolved. Thus we have to resolve them
389 -- explicitely with loadbind. The new module is loaded, then we
390 -- resolve its symbols using the list of already loaded modules
391 -- (only those that belong to the python executable). Get these
392 -- with loadquery(L_GETINFO).
393 */
394 {
395 static void *staticmodlistptr = NULL;
396
397 if (!staticmodlistptr)
398 if (aix_getoldmodules(&staticmodlistptr) == -1)
399 return NULL;
400 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
401 if (p == NULL) {
402 aix_loaderror(pathname);
403 return NULL;
404 }
405 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
406 aix_loaderror(pathname);
407 return NULL;
408 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 }
410#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000411#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000412 {
413 HINSTANCE hDLL;
414 hDLL = LoadLibrary(pathname);
415 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000416 char errBuf[256];
417 unsigned int errorCode;
418
419 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 char theInfo[256]; /* Pointer to error text
421 from system */
422 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000423
424 errorCode = GetLastError();
425
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 theLength = FormatMessage(
427 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
428 NULL, /* message source */
429 errorCode, /* the message (error) ID */
430 0, /* default language environment */
431 (LPTSTR) theInfo, /* the buffer */
432 sizeof(theInfo), /* the buffer size */
433 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000434
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 /* Problem: could not get the error message.
436 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000437 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 sprintf(errBuf,
439 "DLL load failed with error code %d",
440 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000441 } else {
442 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 /* For some reason a \r\n
444 is appended to the text */
445 if (theLength >= 2 &&
446 theInfo[theLength-2] == '\r' &&
447 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000448 theLength -= 2;
449 theInfo[theLength] = '\0';
450 }
451 strcpy(errBuf, "DLL load failed: ");
452 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 strncpy(errBuf+len, theInfo,
454 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000455 errBuf[sizeof(errBuf)-1] = '\0';
456 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 return NULL;
459 }
460 p = GetProcAddress(hDLL, funcname);
461 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000462#endif /* MS_WIN32 */
463#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000464 {
465 HINSTANCE hDLL;
466 hDLL = LoadLibrary(pathname);
467 if (hDLL < HINSTANCE_ERROR){
468 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 sprintf(errBuf,
470 "DLL load failed with error code %d", hDLL);
471 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000472 return NULL;
473 }
474 p = GetProcAddress(hDLL, funcname);
475 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000476#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000477
478#if defined(PYOS_OS2)
479 {
480 APIRET rc;
481 HMODULE hDLL;
482 char failreason[256];
483
484 rc = DosLoadModule(failreason,
485 sizeof(failreason),
486 pathname,
487 &hDLL);
488
489 if (rc != NO_ERROR) {
490 char errBuf[256];
491 sprintf(errBuf,
492 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
493 PyErr_SetString(PyExc_ImportError, errBuf);
494 return NULL;
495 }
496
497 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
498 if (rc != NO_ERROR)
499 p = NULL; /* Signify Failure to Acquire Entrypoint */
500 }
501#endif /* PYOS_OS2 */
502
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505#endif /* USE_DL */
506#ifdef USE_RLD
507 {
508 NXStream *errorStream;
509 struct mach_header *new_header;
510 const char *filenames[2];
511 long ret;
512 unsigned long ptr;
513
514 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
515 filenames[0] = pathname;
516 filenames[1] = NULL;
517 ret = rld_load(errorStream, &new_header,
518 filenames, NULL);
519
520 /* extract the error messages for the exception */
521 if(!ret) {
522 char *streamBuf;
523 int len, maxLen;
524
525 NXPutc(errorStream, (char)0);
526
527 NXGetMemoryBuffer(errorStream,
528 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 }
531
532 if(ret && rld_lookup(errorStream, funcname, &ptr))
533 p = (dl_funcptr) ptr;
534
535 NXCloseMemory(errorStream, NX_FREEBUFFER);
536
537 if(!ret)
538 return NULL;
539 }
540#endif /* USE_RLD */
541#ifdef hpux
542 {
543 shl_t lib;
544 int flags;
545
Guido van Rossum3afb5951996-12-05 23:15:35 +0000546 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
550 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551 printf("shl_load %s\n",pathname);
552 }
553 lib = shl_load(pathname, flags, 0);
554 if (lib == NULL)
555 {
556 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 perror(pathname);
559 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 return NULL;
562 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 printf("shl_findsym %s\n", funcname);
565 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 perror(funcname);
568 }
569#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000570#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000571 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000572#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000574 PyErr_Format(PyExc_ImportError,
575 "dynamic module does not define init function (%s)",
576 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000577 return NULL;
578 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000579 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000581 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000582 if (PyErr_Occurred())
583 return NULL;
584 if (_PyImport_FixupExtension(name, pathname) == NULL)
585 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000587 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000589 PyErr_SetString(PyExc_SystemError,
590 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591 return NULL;
592 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000593 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 d = PyModule_GetDict(m);
595 s = PyString_FromString(pathname);
596 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
597 PyErr_Clear(); /* Not important enough to report */
598 Py_XDECREF(s);
599 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600 fprintf(stderr,
601 "import %s # dynamically loaded from %s\n",
602 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 return m;
605#endif /* DYNAMIC_LINK */
606}
607
608
609#ifdef _AIX
610
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000611#include <ctype.h> /* for isdigit() */
612#include <errno.h> /* for global errno */
613#include <string.h> /* for strerror() */
614#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000616typedef struct Module {
617 struct Module *next;
618 void *entry;
619} Module, *ModulePtr;
620
621static int
622aix_getoldmodules(modlistptr)
623 void **modlistptr;
624{
625 register ModulePtr modptr, prevmodptr;
626 register struct ld_info *ldiptr;
627 register char *ldibuf;
628 register int errflag, bufsize = 1024;
629 register unsigned int offset;
630
631 /*
632 -- Get the list of loaded modules into ld_info structures.
633 */
634 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000636 return -1;
637 }
638 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
639 && errno == ENOMEM) {
640 free(ldibuf);
641 bufsize += 1024;
642 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000644 return -1;
645 }
646 }
647 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000649 return -1;
650 }
651 /*
652 -- Make the modules list from the ld_info structures.
653 */
654 ldiptr = (struct ld_info *)ldibuf;
655 prevmodptr = NULL;
656 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000657 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
658 /*
659 -- Extract only the modules containing "python" as a
660 -- substring, like the "python[version]" executable or
661 -- "libpython[version].a" in case python is embedded.
662 */
663 offset = (unsigned int)ldiptr->ldinfo_next;
664 ldiptr = (struct ld_info *)((unsigned int)
665 ldiptr + offset);
666 continue;
667 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000668 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000670 while (*modlistptr) {
671 modptr = (ModulePtr)*modlistptr;
672 *modlistptr = (void *)modptr->next;
673 free(modptr);
674 }
675 return -1;
676 }
677 modptr->entry = ldiptr->ldinfo_dataorg;
678 modptr->next = NULL;
679 if (prevmodptr == NULL)
680 *modlistptr = (void *)modptr;
681 else
682 prevmodptr->next = modptr;
683 prevmodptr = modptr;
684 offset = (unsigned int)ldiptr->ldinfo_next;
685 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
686 } while (offset);
687 free(ldibuf);
688 return 0;
689}
690
691static int
692aix_bindnewmodule(newmoduleptr, modlistptr)
693 void *newmoduleptr;
694 void *modlistptr;
695{
696 register ModulePtr modptr;
697
698 /*
699 -- Bind the new module with the list of loaded modules.
700 */
701 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
702 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
703 return -1;
704 return 0;
705}
706
707static void
708aix_loaderror(pathname)
709 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710{
711
Guido van Rossum236f62d1996-06-26 21:07:08 +0000712 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000713 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714
715 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000716 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717 char *errstr;
718 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000719 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720 {L_ERROR_NOLIB, "can't load library:"},
721 {L_ERROR_UNDEF, "can't find symbol in library:"},
722 {L_ERROR_RLDBAD,
723 "RLD index out of range or bad relocation type:"},
724 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
725 {L_ERROR_MEMBER,
726 "file not an archive or does not contain requested member:"},
727 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000728 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 {L_ERROR_SYSTEM, "System error:"},
730 {L_ERROR_ERRNO, NULL}
731 };
732
733#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
734#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
735
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000736 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000738 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000740 ERRBUF_APPEND("\n");
741 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 for(i = 0; message[i] && *message[i]; i++) {
743 int nerr = atoi(message[i]);
744 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000745 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000746 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 }
748 while (isdigit(*message[i])) message[i]++ ;
749 ERRBUF_APPEND(message[i]);
750 ERRBUF_APPEND("\n");
751 }
752 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 return;
755}
756
757#endif /* _AIX */