blob: f9e3f3dbaacffeea206d3e8a855b314f3273536b [file] [log] [blame]
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001Instead of hard-coding GIO_MODULE_PATH when glib is built, use dladdr() to
2determine where libglib.so is and use that path to calculate GIO_MODULES_DIR.
3
4This solves relocation problems with GIOModule for native builds of glib.
5
6Upstream-Status: Inappropriate
7Signed-off-by: Ross Burton <ross.burton@intel.com>
8
9diff --git a/gio/giomodule.c b/gio/giomodule.c
10index 56c498c..a2e32b7 100644
11--- a/gio/giomodule.c
12+++ b/gio/giomodule.c
13@@ -47,6 +47,27 @@
14 #include "gdesktopappinfo.h"
15 #endif
16
17+#include <dlfcn.h>
18+
19+/*
20+ * Generate a GIO module directory based on where glib is installed
21+ */
22+static const char *
23+_get_gio_module_dir (void)
24+{
25+ Dl_info info;
26+
27+ if (dladdr (g_io_module_new, &info)) {
28+ char *libdir = g_path_get_dirname (info.dli_fname);
29+ char *dir = g_build_filename (libdir, "gio", "modules", NULL);
30+ g_free (libdir);
31+ return dir;
32+ } else {
33+ return GIO_MODULE_DIR;
34+ }
35+}
36+
37+
38 /**
39 * SECTION:giomodule
40 * @short_description: Loadable GIO Modules
41@@ -1057,7 +1078,7 @@ _g_io_modules_ensure_loaded (void)
42 /* Then load the compiled in path */
43 module_dir = g_getenv ("GIO_MODULE_DIR");
44 if (module_dir == NULL)
45- module_dir = GIO_MODULE_DIR;
46+ module_dir = _get_gio_module_dir ();
47
48 g_io_modules_scan_all_in_directory_with_scope (module_dir, scope);
49