diff options
author | Alexander Köplinger <alex.koeplinger@outlook.com> | 2016-12-06 03:57:33 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-06 03:57:33 +0300 |
commit | 6c326d3938c2fa2f199f7a274c968c0354f0fad1 (patch) | |
tree | e589aceba9f5b21d6d0eb5ed87c600cd1fb78ef8 | |
parent | b7df98a4e158ab3577d81bcf72a903c75be9ee47 (diff) | |
parent | d2623ed2afcb1fce24c3d46088c729589d7ce8e9 (diff) |
Merge pull request #4095 from lewurm/libdir-4.8
[4.8] Handle relocatable libMonoPosixHelper.so when --libdir= isn't lib/
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | mono/metadata/Makefile.am | 2 | ||||
-rw-r--r-- | mono/metadata/assembly.c | 15 | ||||
-rw-r--r-- | mono/metadata/assembly.h | 3 | ||||
-rw-r--r-- | mono/metadata/mono-config-dirs.c | 10 | ||||
-rw-r--r-- | mono/metadata/mono-config-dirs.h | 3 | ||||
-rw-r--r-- | mono/metadata/mono-config.c | 3 |
7 files changed, 38 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac index fa5977bb752..9959c554e0d 100644 --- a/configure.ac +++ b/configure.ac @@ -68,7 +68,11 @@ AC_SUBST(libmono_cflags) AC_SUBST(libmono_ldflags) # Variable to have relocatable .pc files (lib, or lib64) -reloc_libdir=`basename ${libdir}` +# realpath isn't always available, and requires that all but the tip of the provided +# path exists. Fall back to the old behaviour, but realpath allows depth >1 +# e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is +# too deep for the old method to work +reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}` AC_SUBST(reloc_libdir) # Set to yes if Unix sockets cannot be created in an anonymous namespace diff --git a/mono/metadata/Makefile.am b/mono/metadata/Makefile.am index 16575ecc675..945e2e3e102 100644 --- a/mono/metadata/Makefile.am +++ b/mono/metadata/Makefile.am @@ -92,7 +92,7 @@ mono-config-dirs.lo: Makefile libmonoruntime_config_la_SOURCES = \ mono-config-dirs.h \ mono-config-dirs.c -libmonoruntime_config_la_CPPFLAGS = $(AM_CPPFLAGS) -DMONO_BINDIR=\"$(bindir)/\" -DMONO_ASSEMBLIES=\"$(assembliesdir)\" -DMONO_CFG_DIR=\"$(confdir)\" +libmonoruntime_config_la_CPPFLAGS = $(AM_CPPFLAGS) -DMONO_BINDIR=\"$(bindir)/\" -DMONO_ASSEMBLIES=\"$(assembliesdir)\" -DMONO_CFG_DIR=\"$(confdir)\" -DMONO_RELOC_LIBDIR=\"../$(reloc_libdir)\" CLEANFILES = mono-bundle.stamp diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index f3feda4554c..6319d6539ae 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -560,6 +560,21 @@ mono_assembly_getrootdir (void) } /** + * mono_native_getrootdir: + * + * Obtains the root directory used for looking up native libs (.so, .dylib). + * + * Returns: a string with the directory, this string should be freed by + * the caller. + */ +gchar * +mono_native_getrootdir (void) +{ + gchar* fullpath = g_build_path (G_DIR_SEPARATOR_S, mono_assembly_getrootdir (), mono_config_get_reloc_lib_dir(), NULL); + return fullpath; +} + +/** * mono_set_dirs: * @assembly_dir: the base directory for assemblies * @config_dir: the base directory for configuration files diff --git a/mono/metadata/assembly.h b/mono/metadata/assembly.h index 556981f4935..cc080d2a6cf 100644 --- a/mono/metadata/assembly.h +++ b/mono/metadata/assembly.h @@ -36,7 +36,8 @@ MONO_API MonoImage* mono_assembly_load_module (MonoAssembly *assembly, uint32 MONO_API void mono_assembly_close (MonoAssembly *assembly); MONO_API void mono_assembly_setrootdir (const char *root_dir); MONO_API MONO_CONST_RETURN char *mono_assembly_getrootdir (void); -MONO_API void mono_assembly_foreach (MonoFunc func, void* user_data); +MONO_API char *mono_native_getrootdir (void); +MONO_API void mono_assembly_foreach (MonoFunc func, void* user_data); MONO_API void mono_assembly_set_main (MonoAssembly *assembly); MONO_API MonoAssembly *mono_assembly_get_main (void); MONO_API MonoImage *mono_assembly_get_image (MonoAssembly *assembly); diff --git a/mono/metadata/mono-config-dirs.c b/mono/metadata/mono-config-dirs.c index ece67d1286c..2e61a1b3373 100644 --- a/mono/metadata/mono-config-dirs.c +++ b/mono/metadata/mono-config-dirs.c @@ -41,3 +41,13 @@ mono_config_get_bin_dir (void) #endif } +const char* +mono_config_get_reloc_lib_dir (void) +{ +#ifdef MONO_RELOC_LIBDIR + return MONO_RELOC_LIBDIR; +#else + return NULL; +#endif +} + diff --git a/mono/metadata/mono-config-dirs.h b/mono/metadata/mono-config-dirs.h index 9488511bde4..25e76512253 100644 --- a/mono/metadata/mono-config-dirs.h +++ b/mono/metadata/mono-config-dirs.h @@ -13,4 +13,7 @@ mono_config_get_cfg_dir (void); const char* mono_config_get_bin_dir (void); +const char* +mono_config_get_reloc_lib_dir (void); + #endif diff --git a/mono/metadata/mono-config.c b/mono/metadata/mono-config.c index 2bedf12cd8f..fe82c2e037b 100644 --- a/mono/metadata/mono-config.c +++ b/mono/metadata/mono-config.c @@ -314,13 +314,14 @@ dllmap_start (gpointer user_data, else if (strcmp (attribute_names [i], "target") == 0){ char *p = strstr (attribute_values [i], "$mono_libdir"); if (p != NULL){ - const char *libdir = mono_assembly_getrootdir (); + char *libdir = mono_native_getrootdir (); size_t libdir_len = strlen (libdir); char *result; result = (char *)g_malloc (libdir_len-strlen("$mono_libdir")+strlen(attribute_values[i])+1); strncpy (result, attribute_values[i], p-attribute_values[i]); strcpy (result+(p-attribute_values[i]), libdir); + g_free (libdir); strcat (result, p+strlen("$mono_libdir")); info->target = result; } else |