summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/xlator.c4
-rw-r--r--rpc/rpc-lib/src/rpc-transport.c2
-rw-r--r--xlators/features/glupy/src/glupy.c19
3 files changed, 22 insertions, 3 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 3e9814ca19b..b060d393730 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -170,7 +170,7 @@ xlator_volopt_dynload (char *xlator_type, void **dl_handle,
gf_msg_trace ("xlator", 0, "attempt to load file %s", name);
- handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);
+ handle = dlopen (name, RTLD_NOW);
if (!handle) {
gf_msg ("xlator", GF_LOG_WARNING, 0, LG_MSG_DLOPEN_FAILED,
"%s", dlerror ());
@@ -427,7 +427,7 @@ xlator_dynload (xlator_t *xl)
gf_msg_trace ("xlator", 0, "attempt to load file %s", name);
- handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);
+ handle = dlopen (name, RTLD_NOW);
if (!handle) {
gf_msg ("xlator", GF_LOG_WARNING, 0, LG_MSG_DLOPEN_FAILED,
"%s", dlerror ());
diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c
index 40c41ab7016..9497ecf78e5 100644
--- a/rpc/rpc-lib/src/rpc-transport.c
+++ b/rpc/rpc-lib/src/rpc-transport.c
@@ -279,7 +279,7 @@ rpc_transport_load (glusterfs_ctx_t *ctx, dict_t *options, char *trans_name)
gf_log ("rpc-transport", GF_LOG_DEBUG,
"attempt to load file %s", name);
- handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);
+ handle = dlopen (name, RTLD_NOW);
if (handle == NULL) {
gf_log ("rpc-transport", GF_LOG_ERROR, "%s", dlerror ());
gf_log ("rpc-transport", GF_LOG_WARNING,
diff --git a/xlators/features/glupy/src/glupy.c b/xlators/features/glupy/src/glupy.c
index bca476427c8..46d1af5533a 100644
--- a/xlators/features/glupy/src/glupy.c
+++ b/xlators/features/glupy/src/glupy.c
@@ -9,6 +9,7 @@
*/
#include <ctype.h>
+#include <dlfcn.h>
#include <sys/uio.h>
#include <Python.h>
@@ -2331,6 +2332,7 @@ init (xlator_t *this)
PyObject *error_bt = NULL;
static gf_boolean_t py_inited = _gf_false;
void * err_cleanup = &&err_return;
+ char libpython[16];
if (dict_get_str(this->options,"module-name",&module_name) != 0) {
gf_log (this->name, GF_LOG_ERROR, "missing module-name");
@@ -2345,6 +2347,23 @@ init (xlator_t *this)
err_cleanup = &&err_free_priv;
if (!py_inited) {
+ /* FIXME:
+ * This hack is necessary because glusterfs (rightly) loads
+ * glupy.so with RTLD_LOCAL but glupy needs libpython to be
+ * loaded with RTLD_GLOBAL even though glupy is correctly
+ * linked with libpython.
+ * This is needed because one of the internal modules of
+ * python 2.x (lib-dynload/_struct.so) does not explicitly
+ * link with libpython.
+ */
+ snprintf(libpython, sizeof(libpython), "libpython%d.%d.so",
+ PY_MAJOR_VERSION, PY_MINOR_VERSION);
+ if (!dlopen (libpython, RTLD_NOW|RTLD_GLOBAL)) {
+ gf_msg (this->name, GF_LOG_WARNING, 0,
+ LG_MSG_DLOPEN_FAILED, "dlopen(%s) failed: %s",
+ libpython, dlerror ());
+ }
+
/*
* This must be done before Py_Initialize(),
* because it will duplicate the environment,