aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/glib-2.0/glib-2.0/relocate-modules.patch
blob: f9e3f3dbaacffeea206d3e8a855b314f3273536b (plain)
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
Instead of hard-coding GIO_MODULE_PATH when glib is built, use dladdr() to
determine where libglib.so is and use that path to calculate GIO_MODULES_DIR.

This solves relocation problems with GIOModule for native builds of glib.

Upstream-Status: Inappropriate
Signed-off-by: Ross Burton <ross.burton@intel.com>

diff --git a/gio/giomodule.c b/gio/giomodule.c
index 56c498c..a2e32b7 100644
--- a/gio/giomodule.c
+++ b/gio/giomodule.c
@@ -47,6 +47,27 @@
 #include "gdesktopappinfo.h"
 #endif
 
+#include <dlfcn.h>
+
+/*
+ * Generate a GIO module directory based on where glib is installed
+ */
+static const char *
+_get_gio_module_dir (void)
+{
+  Dl_info info;
+
+  if (dladdr (g_io_module_new, &info)) {
+    char *libdir = g_path_get_dirname (info.dli_fname);
+    char *dir = g_build_filename (libdir, "gio", "modules", NULL);
+    g_free (libdir);
+    return dir;
+  } else {
+    return GIO_MODULE_DIR;
+  }
+}
+
+
 /**
  * SECTION:giomodule
  * @short_description: Loadable GIO Modules
@@ -1057,7 +1078,7 @@ _g_io_modules_ensure_loaded (void)
       /* Then load the compiled in path */
       module_dir = g_getenv ("GIO_MODULE_DIR");
       if (module_dir == NULL)
-        module_dir = GIO_MODULE_DIR;
+        module_dir = _get_gio_module_dir ();
 
       g_io_modules_scan_all_in_directory_with_scope (module_dir, scope);