Patrick Williams | d8c66bc | 2016-06-20 12:57:21 -0500 | [diff] [blame] | 1 | Instead of hard-coding GIO_MODULE_PATH when glib is built, use dladdr() to |
| 2 | determine where libglib.so is and use that path to calculate GIO_MODULES_DIR. |
| 3 | |
| 4 | This solves relocation problems with GIOModule for native builds of glib. |
| 5 | |
| 6 | Upstream-Status: Inappropriate |
| 7 | Signed-off-by: Ross Burton <ross.burton@intel.com> |
| 8 | |
| 9 | diff --git a/gio/giomodule.c b/gio/giomodule.c |
| 10 | index 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 | |