blob: 7f35d13095896ff9bb018919fb7e1d36db36489b [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 Rossum1ae940a1995-01-02 19:04:15 +000050 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000051 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
53 LONG_EXT -- long extension, e.g. "module.so"
54 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum46c76a61995-01-20 16:53:54 +000055 __NetBSD__ -- NetBSD shared libraries (not quite SVR4 compatible)
Guido van Rossum25e85291996-02-25 05:02:29 +000056 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057
58 (The other WITH_* symbols are used only once, to set the
59 appropriate symbols.)
60*/
61
62/* Configure dynamic linking */
63
Guido van Rossumff4af061996-01-12 01:17:50 +000064#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000065#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000066#define hpux
67#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000068#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000069
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070#ifdef hpux
71#define DYNAMIC_LINK
72#include <errno.h>
73typedef void (*dl_funcptr)();
74#define _DL_FUNCPTR_DEFINED 1
75#define SHORT_EXT ".sl"
76#define LONG_EXT "module.sl"
77#endif
78
Guido van Rossum9218b701997-05-05 15:03:26 +000079#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +000080#define DYNAMIC_LINK
81#define USE_SHLIB
82
83#define dlerror() "error in dynamic linking"
84#endif
85
Guido van Rossum9b38a141996-09-11 23:12:24 +000086#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087#define DYNAMIC_LINK
88#include <windows.h>
89typedef FARPROC dl_funcptr;
90#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +000091#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +000092#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093#endif
94
Guido van Rossum75f288d1995-06-14 22:07:26 +000095#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096#define DYNAMIC_LINK
97#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +000098#define SHORT_EXT ".so"
99#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000100#endif
101
102#ifdef WITH_SGI_DL
103#define DYNAMIC_LINK
104#define USE_DL
105#endif
106
107#ifdef WITH_DL_DLD
108#define DYNAMIC_LINK
109#define USE_DL
110#endif
111
Jack Jansen5d9acb61995-06-14 14:54:25 +0000112#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000113#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000114#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000115#ifdef __CFM68K__
116#define LONG_EXT ".CFM68K.slb"
117#else
118#define LONG_EXT ".ppc.slb"
119#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000120#ifndef _DL_FUNCPTR_DEFINED
121typedef void (*dl_funcptr)();
122#endif
123#endif
124
Guido van Rossum504f4a91996-08-20 19:59:07 +0000125#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000126#define DYNAMIC_LINK
127#define USE_SHLIB
128#endif
129
130#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000131#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 +0000132#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000133#define SHORT_EXT ".so"
134#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135#include <sys/ldr.h>
136typedef void (*dl_funcptr)();
137#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000138static int aix_getoldmodules(void **);
139static int aix_bindnewmodule(void *, void *);
140static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141#endif
142
143#ifdef DYNAMIC_LINK
144
145#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000146#include <sys/types.h>
147#include <sys/stat.h>
Guido van Rossum9218b701997-05-05 15:03:26 +0000148#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000149#include <nlist.h>
150#include <link.h>
151#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000152#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000154#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000155#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000156#ifndef _DL_FUNCPTR_DEFINED
157typedef void (*dl_funcptr)();
158#endif
159#ifndef RTLD_LAZY
160#define RTLD_LAZY 1
161#endif
162#define SHORT_EXT ".so"
163#define LONG_EXT "module.so"
164#endif /* USE_SHLIB */
165
166#if defined(USE_DL) || defined(hpux)
167#include "dl.h"
168#endif
169
Jack Jansen5d9acb61995-06-14 14:54:25 +0000170#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000171#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000172#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000174#define CFragConnectionID ConnectionID
175#define kLoadCFrag 0x01
176#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000177#include <Files.h>
178#include "macdefs.h"
179#include "macglue.h"
180#endif
181
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182#ifdef USE_RLD
183#include <mach-o/rld.h>
184#define FUNCNAME_PATTERN "_init%.200s"
185#ifndef _DL_FUNCPTR_DEFINED
186typedef void (*dl_funcptr)();
187#endif
188#endif /* USE_RLD */
189
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000191
192#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000193#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194#define FUNCNAME_PATTERN "_init%.200s"
195#else
196#define FUNCNAME_PATTERN "init%.200s"
197#endif
198#endif
199
200#if !defined(SHORT_EXT) && !defined(LONG_EXT)
201#define SHORT_EXT ".o"
202#define LONG_EXT "module.o"
203#endif /* !SHORT_EXT && !LONG_EXT */
204
205#endif /* DYNAMIC_LINK */
206
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208#ifdef SHORT_EXT
209 {SHORT_EXT, "rb", C_EXTENSION},
210#endif /* !SHORT_EXT */
211#ifdef LONG_EXT
212 {LONG_EXT, "rb", C_EXTENSION},
213#endif /* !LONG_EXT */
214 {".py", "r", PY_SOURCE},
215 {".pyc", "rb", PY_COMPILED},
216 {0, 0}
217};
218
Guido van Rossum38234201996-07-31 17:55:19 +0000219#ifdef NO_DYNAMIC_LINK
220#undef DYNAMIC_LINK
221#endif
222
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223PyObject *
224_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000225 char *name;
226 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000227 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000228{
229#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 PyErr_SetString(PyExc_ImportError,
231 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000232 return NULL;
233#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000236 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000238#ifdef USE_SHLIB
239 static struct {
240 dev_t dev;
241 ino_t ino;
242 void *handle;
243 } handles[128];
244 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000245 char pathbuf[260];
246 if (strchr(pathname, '/') == NULL) {
247 /* Prefix bare filename with "./" */
248 sprintf(pathbuf, "./%-.255s", pathname);
249 pathname = pathbuf;
250 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000251#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000252 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
253 Py_INCREF(m);
254 return m;
255 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000256 lastdot = strrchr(name, '.');
257 if (lastdot == NULL) {
258 packagecontext = NULL;
259 shortname = name;
260 }
261 else {
262 packagecontext = name;
263 shortname = lastdot+1;
264 }
265 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000266#ifdef USE_SHLIB
267 if (fp != NULL) {
268 int i;
269 struct stat statb;
270 fstat(fileno(fp), &statb);
271 for (i = 0; i < nhandles; i++) {
272 if (statb.st_dev == handles[i].dev &&
273 statb.st_ino == handles[i].ino) {
274 p = (dl_funcptr) dlsym(handles[i].handle,
275 funcname);
276 goto got_it;
277 }
278 }
279 if (nhandles < 128) {
280 handles[nhandles].dev = statb.st_dev;
281 handles[nhandles].ino = statb.st_ino;
282 }
283 }
284#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000285#ifdef USE_MAC_DYNAMIC_LOADING
286 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 ** Dynamic loading of CFM shared libraries on the Mac. The
288 ** code has become more convoluted than it was, because we
289 ** want to be able to put multiple modules in a single
290 ** file. For this reason, we have to determine the fragment
291 ** name, and we cannot use the library entry point but we have
292 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000293 */
Jack Jansen4e043731995-02-13 22:42:34 +0000294 {
295 FSSpec libspec;
296 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000297 Ptr mainAddr;
298 Str255 errMessage;
299 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000300 Boolean isfolder, didsomething;
301 char buf[512];
302 Str63 fragname;
303 Ptr symAddr;
304 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000305
Jack Jansen5d9acb61995-06-14 14:54:25 +0000306 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000307 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000308 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
309 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000310 sprintf(buf, "%.255s: %.200s",
311 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000313 return NULL;
314 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 /* Next, determine the fragment name,
316 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000317 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
318 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 if( strncmp((char *)(fragname+1+fragname[0]-4),
320 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000321 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 if ( strncmp((char *)(fragname+1+fragname[0]-6),
323 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000324 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 /* Load the fragment
326 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000327 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000328 kLoadCFrag, &connID, &mainAddr,
329 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000330 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000331 sprintf(buf, "%.*s: %.200s",
332 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyMac_StrError(err));
334 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000335 return NULL;
336 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000337 /* Locate the address of the correct init function */
338 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
339 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000340 sprintf(buf, "%s: %.200s",
341 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000343 return NULL;
344 }
345 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000346 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000347#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000348#ifdef USE_SHLIB
349 {
350#ifdef RTLD_NOW
351 /* RTLD_NOW: resolve externals now
352 (i.e. core dump now if some are missing) */
353 void *handle = dlopen(pathname, RTLD_NOW);
354#else
355 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
358 handle = dlopen(pathname, RTLD_LAZY);
359#endif /* RTLD_NOW */
360 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362 return NULL;
363 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000364 if (fp != NULL && nhandles < 128)
365 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000366 p = (dl_funcptr) dlsym(handle, funcname);
367 }
368#endif /* USE_SHLIB */
369#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000370 /*
371 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
372 -- of the shared module unresolved. Thus we have to resolve them
373 -- explicitely with loadbind. The new module is loaded, then we
374 -- resolve its symbols using the list of already loaded modules
375 -- (only those that belong to the python executable). Get these
376 -- with loadquery(L_GETINFO).
377 */
378 {
379 static void *staticmodlistptr = NULL;
380
381 if (!staticmodlistptr)
382 if (aix_getoldmodules(&staticmodlistptr) == -1)
383 return NULL;
384 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
385 if (p == NULL) {
386 aix_loaderror(pathname);
387 return NULL;
388 }
389 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
390 aix_loaderror(pathname);
391 return NULL;
392 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 }
394#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000395#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000396 {
397 HINSTANCE hDLL;
398 hDLL = LoadLibrary(pathname);
399 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000400 char errBuf[256];
401 unsigned int errorCode;
402
403 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 char theInfo[256]; /* Pointer to error text
405 from system */
406 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000407
408 errorCode = GetLastError();
409
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 theLength = FormatMessage(
411 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
412 NULL, /* message source */
413 errorCode, /* the message (error) ID */
414 0, /* default language environment */
415 (LPTSTR) theInfo, /* the buffer */
416 sizeof(theInfo), /* the buffer size */
417 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000418
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 /* Problem: could not get the error message.
420 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000421 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 sprintf(errBuf,
423 "DLL load failed with error code %d",
424 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000425 } else {
426 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 /* For some reason a \r\n
428 is appended to the text */
429 if (theLength >= 2 &&
430 theInfo[theLength-2] == '\r' &&
431 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000432 theLength -= 2;
433 theInfo[theLength] = '\0';
434 }
435 strcpy(errBuf, "DLL load failed: ");
436 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 strncpy(errBuf+len, theInfo,
438 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000439 errBuf[sizeof(errBuf)-1] = '\0';
440 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 return NULL;
443 }
444 p = GetProcAddress(hDLL, funcname);
445 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000446#endif /* MS_WIN32 */
447#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000448 {
449 HINSTANCE hDLL;
450 hDLL = LoadLibrary(pathname);
451 if (hDLL < HINSTANCE_ERROR){
452 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 sprintf(errBuf,
454 "DLL load failed with error code %d", hDLL);
455 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000456 return NULL;
457 }
458 p = GetProcAddress(hDLL, funcname);
459 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000460#endif /* MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463#endif /* USE_DL */
464#ifdef USE_RLD
465 {
466 NXStream *errorStream;
467 struct mach_header *new_header;
468 const char *filenames[2];
469 long ret;
470 unsigned long ptr;
471
472 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
473 filenames[0] = pathname;
474 filenames[1] = NULL;
475 ret = rld_load(errorStream, &new_header,
476 filenames, NULL);
477
478 /* extract the error messages for the exception */
479 if(!ret) {
480 char *streamBuf;
481 int len, maxLen;
482
483 NXPutc(errorStream, (char)0);
484
485 NXGetMemoryBuffer(errorStream,
486 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488 }
489
490 if(ret && rld_lookup(errorStream, funcname, &ptr))
491 p = (dl_funcptr) ptr;
492
493 NXCloseMemory(errorStream, NX_FREEBUFFER);
494
495 if(!ret)
496 return NULL;
497 }
498#endif /* USE_RLD */
499#ifdef hpux
500 {
501 shl_t lib;
502 int flags;
503
Guido van Rossum3afb5951996-12-05 23:15:35 +0000504 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
508 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509 printf("shl_load %s\n",pathname);
510 }
511 lib = shl_load(pathname, flags, 0);
512 if (lib == NULL)
513 {
514 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 perror(pathname);
517 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 return NULL;
520 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 printf("shl_findsym %s\n", funcname);
523 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 perror(funcname);
526 }
527#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000528#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000529 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000530#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000532 PyErr_Format(PyExc_ImportError,
533 "dynamic module does not define init function (%s)",
534 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 return NULL;
536 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000537 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000539 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000540 if (PyErr_Occurred())
541 return NULL;
542 if (_PyImport_FixupExtension(name, pathname) == NULL)
543 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000545 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000547 PyErr_SetString(PyExc_SystemError,
548 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 return NULL;
550 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000551 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 d = PyModule_GetDict(m);
553 s = PyString_FromString(pathname);
554 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
555 PyErr_Clear(); /* Not important enough to report */
556 Py_XDECREF(s);
557 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 fprintf(stderr,
559 "import %s # dynamically loaded from %s\n",
560 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000562 return m;
563#endif /* DYNAMIC_LINK */
564}
565
566
567#ifdef _AIX
568
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000569#include <ctype.h> /* for isdigit() */
570#include <errno.h> /* for global errno */
571#include <string.h> /* for strerror() */
572#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000574typedef struct Module {
575 struct Module *next;
576 void *entry;
577} Module, *ModulePtr;
578
579static int
580aix_getoldmodules(modlistptr)
581 void **modlistptr;
582{
583 register ModulePtr modptr, prevmodptr;
584 register struct ld_info *ldiptr;
585 register char *ldibuf;
586 register int errflag, bufsize = 1024;
587 register unsigned int offset;
588
589 /*
590 -- Get the list of loaded modules into ld_info structures.
591 */
592 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000594 return -1;
595 }
596 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
597 && errno == ENOMEM) {
598 free(ldibuf);
599 bufsize += 1024;
600 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000602 return -1;
603 }
604 }
605 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000607 return -1;
608 }
609 /*
610 -- Make the modules list from the ld_info structures.
611 */
612 ldiptr = (struct ld_info *)ldibuf;
613 prevmodptr = NULL;
614 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000615 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
616 /*
617 -- Extract only the modules containing "python" as a
618 -- substring, like the "python[version]" executable or
619 -- "libpython[version].a" in case python is embedded.
620 */
621 offset = (unsigned int)ldiptr->ldinfo_next;
622 ldiptr = (struct ld_info *)((unsigned int)
623 ldiptr + offset);
624 continue;
625 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000626 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000628 while (*modlistptr) {
629 modptr = (ModulePtr)*modlistptr;
630 *modlistptr = (void *)modptr->next;
631 free(modptr);
632 }
633 return -1;
634 }
635 modptr->entry = ldiptr->ldinfo_dataorg;
636 modptr->next = NULL;
637 if (prevmodptr == NULL)
638 *modlistptr = (void *)modptr;
639 else
640 prevmodptr->next = modptr;
641 prevmodptr = modptr;
642 offset = (unsigned int)ldiptr->ldinfo_next;
643 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
644 } while (offset);
645 free(ldibuf);
646 return 0;
647}
648
649static int
650aix_bindnewmodule(newmoduleptr, modlistptr)
651 void *newmoduleptr;
652 void *modlistptr;
653{
654 register ModulePtr modptr;
655
656 /*
657 -- Bind the new module with the list of loaded modules.
658 */
659 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
660 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
661 return -1;
662 return 0;
663}
664
665static void
666aix_loaderror(pathname)
667 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668{
669
Guido van Rossum236f62d1996-06-26 21:07:08 +0000670 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000671 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672
673 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000674 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675 char *errstr;
676 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000677 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 {L_ERROR_NOLIB, "can't load library:"},
679 {L_ERROR_UNDEF, "can't find symbol in library:"},
680 {L_ERROR_RLDBAD,
681 "RLD index out of range or bad relocation type:"},
682 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
683 {L_ERROR_MEMBER,
684 "file not an archive or does not contain requested member:"},
685 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000686 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687 {L_ERROR_SYSTEM, "System error:"},
688 {L_ERROR_ERRNO, NULL}
689 };
690
691#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
692#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
693
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000694 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000696 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000698 ERRBUF_APPEND("\n");
699 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000700 for(i = 0; message[i] && *message[i]; i++) {
701 int nerr = atoi(message[i]);
702 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000703 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000704 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705 }
706 while (isdigit(*message[i])) message[i]++ ;
707 ERRBUF_APPEND(message[i]);
708 ERRBUF_APPEND("\n");
709 }
710 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 return;
713}
714
715#endif /* _AIX */