summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPrashanth Pai <ppai@redhat.com>2017-12-19 22:35:53 +0530
committerJeff Darcy <jeff@pl.atyp.us>2017-12-27 15:49:49 +0000
commitc6aad575171d4749d1ef2b5fc7c9fd7c32c1c59f (patch)
treea5752947f58fe52fea185117b710227211f23cb8
parentee26765bdff77a4aa23efd0a8936d4306ec61c4b (diff)
Use RTLD_LOCAL for symbol resolution
RTLD_LOCAL is the default value for symbol visibility flag of dlopen() in Linux and NetBSD. Using it avoids conflicts during symbol resolution. This also allows us to detect xlators that have not been explicitly linked with libraries that they use. This used to go unnoticed when RTLD_GLOBAL was being used. BUG: 1193929 Change-Id: I50db6ea14ffdee96596060c4d6bf71cd3c432f7b Signed-off-by: Prashanth Pai <ppai@redhat.com>
-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,