Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Köplinger <alex.koeplinger@outlook.com>2016-12-06 03:57:33 +0300
committerGitHub <noreply@github.com>2016-12-06 03:57:33 +0300
commit6c326d3938c2fa2f199f7a274c968c0354f0fad1 (patch)
treee589aceba9f5b21d6d0eb5ed87c600cd1fb78ef8
parentb7df98a4e158ab3577d81bcf72a903c75be9ee47 (diff)
parentd2623ed2afcb1fce24c3d46088c729589d7ce8e9 (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.ac6
-rw-r--r--mono/metadata/Makefile.am2
-rw-r--r--mono/metadata/assembly.c15
-rw-r--r--mono/metadata/assembly.h3
-rw-r--r--mono/metadata/mono-config-dirs.c10
-rw-r--r--mono/metadata/mono-config-dirs.h3
-rw-r--r--mono/metadata/mono-config.c3
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