- Notifications
You must be signed in to change notification settings - Fork 31.8k
/
Copy pathdynload_shlib.c
111 lines (95 loc) · 2.86 KB
/
dynload_shlib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* Support for dynamic loading of extension modules */
#include"Python.h"
#include"pycore_interp.h"// _PyInterpreterState.dlopenflags
#include"pycore_pystate.h"// _PyInterpreterState_GET()
#include"pycore_importdl.h"
#include<sys/types.h>
#include<sys/stat.h>
#if defined(__NetBSD__)
#include<sys/param.h>
#if (NetBSD<199712)
#include<nlist.h>
#include<link.h>
#definedlerror() "error in dynamic linking"
#endif
#endif/* NetBSD */
#ifdefHAVE_DLFCN_H
#include<dlfcn.h>
#endif
#if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__)
#defineLEAD_UNDERSCORE "_"
#else
#defineLEAD_UNDERSCORE ""
#endif
/* The .so extension module ABI tag, supplied by the Makefile via
Makefile.pre.in and configure. This is used to discriminate between
incompatible .so files so that extensions for different Python builds can
live in the same directory. E.g. foomodule.cpython-32.so
*/
constchar*_PyImport_DynLoadFiletab[] = {
#ifdef__CYGWIN__
".dll",
#else/* !__CYGWIN__ */
"."SOABI".so",
#ifdefALT_SOABI
"."ALT_SOABI".so",
#endif
".abi"PYTHON_ABI_STRING".so",
".so",
#endif/* __CYGWIN__ */
NULL,
};
dl_funcptr
_PyImport_FindSharedFuncptr(constchar*prefix,
constchar*shortname,
constchar*pathname, FILE*fp)
{
dl_funcptrp;
void*handle;
charfuncname[258];
charpathbuf[260];
intdlopenflags=0;
if (strchr(pathname, '/') ==NULL) {
/* Prefix bare filename with "./" */
PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
pathname=pathbuf;
}
PyOS_snprintf(funcname, sizeof(funcname),
LEAD_UNDERSCORE"%.20s_%.200s", prefix, shortname);
if (fp!=NULL) {
struct_Py_stat_structstatus;
if (_Py_fstat(fileno(fp), &status) ==-1)
returnNULL;
}
dlopenflags=_PyImport_GetDLOpenFlags(_PyInterpreterState_GET());
handle=dlopen(pathname, dlopenflags);
if (handle==NULL) {
PyObject*mod_name;
PyObject*path;
PyObject*error_ob;
constchar*error=dlerror();
if (error==NULL)
error="unknown dlopen() error";
error_ob=PyUnicode_DecodeLocale(error, "surrogateescape");
if (error_ob==NULL)
returnNULL;
mod_name=PyUnicode_FromString(shortname);
if (mod_name==NULL) {
Py_DECREF(error_ob);
returnNULL;
}
path=PyUnicode_DecodeFSDefault(pathname);
if (path==NULL) {
Py_DECREF(error_ob);
Py_DECREF(mod_name);
returnNULL;
}
PyErr_SetImportError(error_ob, mod_name, path);
Py_DECREF(error_ob);
Py_DECREF(mod_name);
Py_DECREF(path);
returnNULL;
}
p= (dl_funcptr) dlsym(handle, funcname);
returnp;
}