Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Add dlopenflags to PyInterpreterState, and use it in dlopen calls.
diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c
index 7c8bfd2..7de3b7d 100644
--- a/Python/dynload_shlib.c
+++ b/Python/dynload_shlib.c
@@ -22,10 +22,6 @@
 #define LEAD_UNDERSCORE ""
 #endif
 
-#ifndef RTLD_LAZY
-#define RTLD_LAZY 1
-#endif
-
 
 const struct filedescr _PyImport_DynLoadFiletab[] = {
 #ifdef __CYGWIN__
@@ -53,6 +49,7 @@
 	void *handle;
 	char funcname[258];
 	char pathbuf[260];
+        int dlopenflags=0;
 
 	if (strchr(pathname, '/') == NULL) {
 		/* Prefix bare filename with "./" */
@@ -80,16 +77,13 @@
 		}
 	}
 
-#ifdef RTLD_NOW
-	/* RTLD_NOW: resolve externals now
-	   (i.e. core dump now if some are missing) */
-	handle = dlopen(pathname, RTLD_NOW);
-#else
+        dlopenflags = PyThreadState_Get()->interp->dlopenflags;
+
 	if (Py_VerboseFlag)
-		printf("dlopen(\"%s\", %d);\n", pathname,
-		       RTLD_LAZY);
-	handle = dlopen(pathname, RTLD_LAZY);
-#endif /* RTLD_NOW */
+		printf("dlopen(\"%s\", %x);\n", pathname, dlopenflags);
+
+	handle = dlopen(pathname, dlopenflags);
+
 	if (handle == NULL) {
 		PyErr_SetString(PyExc_ImportError, dlerror());
 		return NULL;
diff --git a/Python/pystate.c b/Python/pystate.c
index cca1e7c..2f15fdf 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -3,6 +3,16 @@
 
 #include "Python.h"
 
+#ifdef HAVE_DLOPEN
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#endif
+
+
 #define ZAP(x) { \
 	PyObject *tmp = (PyObject *)(x); \
 	(x) = NULL; \
@@ -39,6 +49,13 @@
 		interp->builtins = NULL;
 		interp->checkinterval = 10;
 		interp->tstate_head = NULL;
+#ifdef HAVE_DLOPEN
+#ifdef RTLD_NOW
+                interp->dlopenflags = RTLD_NOW;
+#else
+		interp->dlopenflags = RTLD_LAZY;
+#endif
+#endif
 
 		HEAD_LOCK();
 		interp->next = interp_head;
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 76d40bf..0d6d5a0 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -394,6 +394,48 @@
 of the Python interpreter stack.  This limit prevents infinite\n\
 recursion from causing an overflow of the C stack and crashing Python.";
 
+#ifdef HAVE_DLOPEN
+static PyObject *
+sys_setdlopenflags(PyObject *self, PyObject *args)
+{
+	int new_val;
+        PyThreadState *tstate = PyThreadState_Get();
+	if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
+		return NULL;
+        if (!tstate)
+		return NULL;
+        tstate->interp->dlopenflags = new_val;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static char setdlopenflags_doc[] =
+"setdlopenflags(n) -> None\n\
+\n\
+Set the flags that will be used for dlopen() calls. Among other\n\
+things, this will enable a lazy resolving of symbols when imporing\n\
+a module, if called as sys.setdlopenflags(0)\n\
+To share symols across extension modules, call as\n\
+sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)";
+
+static PyObject *
+sys_getdlopenflags(PyObject *self, PyObject *args)
+{
+        PyThreadState *tstate = PyThreadState_Get();
+	if (!PyArg_ParseTuple(args, ":getdlopenflags"))
+		return NULL;
+        if (!tstate)
+		return NULL;
+        return PyInt_FromLong(tstate->interp->dlopenflags);
+}
+
+static char getdlopenflags_doc[] =
+"getdlopenflags() -> int\n\
+\n\
+Return the current value of the flags that are used for dlopen()\n\
+calls. The flag constants are defined in the dl module.";
+#endif
+
 #ifdef USE_MALLOPT
 /* Link with -lmalloc (or -lmpc) on an SGI */
 #include <malloc.h>
@@ -501,6 +543,10 @@
 	{"exit",	sys_exit, 0, exit_doc},
 	{"getdefaultencoding", sys_getdefaultencoding, 1,
 	 getdefaultencoding_doc}, 
+#ifdef HAVE_DLOPEN
+        {"getdlopenflags", sys_getdlopenflags, 1, 
+         getdlopenflags_doc},
+#endif
 #ifdef COUNT_ALLOCS
 	{"getcounts",	sys_getcounts, 1},
 #endif
@@ -522,6 +568,10 @@
 	 setdefaultencoding_doc}, 
 	{"setcheckinterval",	sys_setcheckinterval, 1,
 	 setcheckinterval_doc}, 
+#ifdef HAVE_DLOPEN
+        {"setdlopenflags", sys_setdlopenflags, 1, 
+         setdlopenflags_doc},
+#endif
 	{"setprofile",	sys_setprofile, 0, setprofile_doc},
 	{"setrecursionlimit", sys_setrecursionlimit, 1,
 	 setrecursionlimit_doc},
@@ -659,9 +709,11 @@
 excepthook() -- print an exception and its traceback to sys.stderr\n\
 exc_info() -- return thread-safe information about the current exception\n\
 exit() -- exit the interpreter by raising SystemExit\n\
+getdlopenflags() -- returns flags to be used for dlopen() calls\n\
 getrefcount() -- return the reference count for an object (plus one :-)\n\
 getrecursionlimit() -- return the max recursion depth for the interpreter\n\
 setcheckinterval() -- control how often the interpreter checks for events\n\
+setdlopenflags() -- set the flags to be used for dlopen() calls\n\
 setprofile() -- set the global profiling function\n\
 setrecursionlimit() -- set the max recursion depth for the interpreter\n\
 settrace() -- set the global debug tracing function\n\