[netcore] Move P/Invoke directory lookup from mono_dl_fallback to pinvoke_probe_for_m...
authorFilip Navara <navara@emclient.com>
Tue, 26 Mar 2019 21:23:28 +0000 (22:23 +0100)
committerMarek Safar <marek.safar@gmail.com>
Thu, 28 Mar 2019 13:36:07 +0000 (14:36 +0100)
Commit migrated from https://github.com/mono/mono/commit/4648210f3b9bdf5ef43984998abbe4da038c9d46

src/mono/mono/metadata/loader-internals.h
src/mono/mono/metadata/loader.c
src/mono/mono/mini/main-core.c
src/mono/mono/utils/mono-dl.c
src/mono/mono/utils/mono-dl.h

index 53df29c..957caa8 100644 (file)
@@ -12,4 +12,9 @@
 gpointer
 mono_lookup_pinvoke_call_internal (MonoMethod *method, MonoError *error);
 
+#ifdef ENABLE_NETCORE
+void
+mono_set_pinvoke_search_directories (int dir_count, char **dirs);
+#endif
+
 #endif
index 703f850..db6235f 100644 (file)
@@ -76,6 +76,11 @@ static gint32 signatures_size;
  */
 static MonoNativeTlsKey loader_lock_nest_id;
 
+#if ENABLE_NETCORE
+static int pinvoke_search_directories_count;
+static char **pinvoke_search_directories;
+#endif
+
 static void dllmap_cleanup (void);
 static void cached_module_cleanup(void);
 
@@ -1586,6 +1591,15 @@ pinvoke_probe_for_module (MonoImage *image, const char*new_scope, const char *im
        return module;
 }
 
+#if ENABLE_NETCORE
+void
+mono_set_pinvoke_search_directories (int dir_count, char **dirs)
+{
+       pinvoke_search_directories_count = dir_count;
+       pinvoke_search_directories = dirs;
+}
+#endif
+
 static MonoDl*
 pinvoke_probe_for_module_relative_directories (MonoImage *image, const char *file_name, char **found_name_out)
 {
@@ -1595,10 +1609,41 @@ pinvoke_probe_for_module_relative_directories (MonoImage *image, const char *fil
 
        g_assert (found_name_out);
 
-                       int j;
-                       void *iter;
-                       char *mdirname;
+       int j;
+       void *iter;
+       char *mdirname;
+
+#if ENABLE_NETCORE
+       mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_DLLIMPORT, "netcore DllImport handler: wanted '%s'", file_name);
+
+       for (j = 0; j < pinvoke_search_directories_count + 1 && module == NULL; ++j) {
+               if (j < pinvoke_search_directories_count) {
+                       mdirname = pinvoke_search_directories[j];
+               } else {
+                       // TODO: Check DefaultDllImportSearchPathsAttribute, NativeLibrary callback
+                       mdirname = g_path_get_dirname (image->name);
+                       if (!mdirname)
+                               continue;
+               }
+
+               iter = NULL;
+               while ((full_name = mono_dl_build_path (mdirname, file_name, &iter)) && module == NULL) {
+                       char *error_msg;
+                       module = cached_module_load (full_name, MONO_DL_LAZY, &error_msg);
+                       if (!module) {
+                               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_DLLIMPORT, "DllImport error loading library '%s': '%s'.", full_name, error_msg);
+                               g_free (error_msg);
+                       } else {
+                               found_name = g_strdup (full_name);
+                       }
+                       g_free (full_name);
+               }
 
+               if (j >= pinvoke_search_directories_count) {
+                       g_free (mdirname);
+               }
+       }
+#else
                        for (j = 0; j < 3; ++j) {
                                iter = NULL;
                                mdirname = NULL;
@@ -1675,9 +1720,10 @@ pinvoke_probe_for_module_relative_directories (MonoImage *image, const char *fil
                                if (module)
                                        break;
                        }
+#endif
 
-               *found_name_out = found_name;
-               return module;
+       *found_name_out = found_name;
+       return module;
 }
 
 
index 6bef1b7..d60af48 100644 (file)
@@ -3,6 +3,7 @@
 #include "mini-runtime.h"
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/assembly-internals.h>
+#include <mono/metadata/loader-internals.h>
 #include <mono/utils/mono-logger-internals.h>
 
 MONO_API int coreclr_initialize (const char* exePath, const char* appDomainFriendlyName,
@@ -32,7 +33,6 @@ typedef struct {
 
 static MonoCoreTrustedPlatformAssemblies *trusted_platform_assemblies;
 static MonoCoreNativeLibPaths *native_lib_paths;
-static MonoDlFallbackHandler *dl_fallback_handler;
 
 static void
 mono_core_trusted_platform_assemblies_free (MonoCoreTrustedPlatformAssemblies *a)
@@ -155,52 +155,6 @@ install_assembly_loader_hooks (void)
        mono_install_assembly_preload_hook (mono_core_preload_hook, (void*)trusted_platform_assemblies);
 }
 
-static void*
-mono_core_dl_load (const char *name, int flags, char **error_msg, void *user_data)
-{
-       mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_DLLIMPORT, "netcore DllImport fallback handler: wanted '%s'", name);
-
-       if (g_path_is_absolute(name)) {
-               return mono_dl_open_file (name, flags);
-       } else if (native_lib_paths != NULL) {
-               for (int i = 0; i < native_lib_paths->dir_count; ++i) {
-                       char *fullpath = g_build_filename (native_lib_paths->dirs[i], name);
-                       mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_DLLIMPORT, "netcore DllImport fallback handler: trying '%s'", fullpath);
-                       void *lib = mono_dl_open_file (fullpath, flags);
-                       g_free (fullpath);
-                       if (lib)
-                               return lib;
-               }
-       }
-       return NULL;
-}
-
-static void*
-mono_core_dl_symbol (void *handle, const char *name, char **err, void *user_data)
-{
-       return mono_dl_symbol_default ((MonoDl*)handle, name);
-}
-
-static void*
-mono_core_dl_close (void *module, void* usr_data)
-{
-       mono_dl_close_handle ((MonoDl*)module);
-       return NULL;
-}
-
-static void
-install_dl_fallback_handlers (void)
-{
-       dl_fallback_handler = mono_dl_fallback_register_internal (&mono_core_dl_load, &mono_core_dl_symbol, &mono_core_dl_close, NULL);
-}
-
-static void
-cleanup_dl_fallback_handlers (void)
-{
-       mono_dl_fallback_unregister (dl_fallback_handler);
-       dl_fallback_handler = NULL;
-}
-
 static gboolean
 parse_properties (int propertyCount, const char** propertyKeys, const char** propertyValues)
 {
@@ -250,7 +204,8 @@ int coreclr_initialize (const char* exePath, const char* appDomainFriendlyName,
                return 0x80004005; /* E_FAIL */
 
        install_assembly_loader_hooks ();
-       install_dl_fallback_handlers ();
+       if (native_lib_paths != NULL)
+               mono_set_pinvoke_search_directories (native_lib_paths->dir_count, native_lib_paths->dirs);
 
        return 0;
 }
@@ -316,7 +271,7 @@ int coreclr_execute_assembly (void* hostHandle, unsigned int domainId,
 //
 int coreclr_shutdown_2 (void* hostHandle, unsigned int domainId, int* latchedExitCode)
 {
-       cleanup_dl_fallback_handlers ();
+       mono_set_pinvoke_search_directories (0, NULL);
        MonoCoreNativeLibPaths *dl = native_lib_paths;
        native_lib_paths = NULL;
        mono_core_native_lib_paths_free (dl);
index e8ec84f..043f0ab 100644 (file)
@@ -205,33 +205,6 @@ mono_dl_open (const char *name, int flags, char **error_msg)
 }
 
 /**
- * mono_dl_symbol_default:
- * \param module a MonoDl pointer
- * \param name symbol name
- * Load the address of symbol \p name from the given \p module.
- * \returns Address of the symbol or NULL on failure
- */
-void*
-mono_dl_symbol_default (MonoDl *module, const char *name)
-{
-       void * sym;
-       {
-#if MONO_DL_NEED_USCORE
-               {
-                       char *usname = g_malloc (strlen (name) + 2);
-                       *usname = '_';
-                       strcpy (usname + 1, name);
-                       sym = mono_dl_lookup_symbol (module, usname);
-                       g_free (usname);
-               }
-#else
-               sym = mono_dl_lookup_symbol (module, name);
-#endif
-       }
-       return sym;
-}
-
-/**
  * mono_dl_symbol:
  * \param module a MonoDl pointer
  * \param name symbol name
@@ -249,7 +222,17 @@ mono_dl_symbol (MonoDl *module, const char *name, void **symbol)
        if (module->dl_fallback) {
                sym = module->dl_fallback->symbol_func (module->handle, name, &err, module->dl_fallback->user_data);
        } else {
-               sym = mono_dl_symbol_default (module, name);
+#if MONO_DL_NEED_USCORE
+               {
+                       char *usname = g_malloc (strlen (name) + 2);
+                       *usname = '_';
+                       strcpy (usname + 1, name);
+                       sym = mono_dl_lookup_symbol (module, usname);
+                       g_free (usname);
+               }
+#else
+               sym = mono_dl_lookup_symbol (module, name);
+#endif
        }
 
        if (sym) {
@@ -374,15 +357,6 @@ mono_dl_fallback_register (MonoDlFallbackLoad load_func, MonoDlFallbackSymbol sy
 {
        MonoDlFallbackHandler *handler = NULL;
        MONO_ENTER_GC_UNSAFE;
-       handler = mono_dl_fallback_register_internal (load_func, symbol_func, close_func, user_data);
-       MONO_EXIT_GC_UNSAFE;
-       return handler;
-}
-
-MonoDlFallbackHandler *
-mono_dl_fallback_register_internal (MonoDlFallbackLoad load_func, MonoDlFallbackSymbol symbol_func, MonoDlFallbackClose close_func, void *user_data)
-{
-       MonoDlFallbackHandler *handler = NULL;
        if (load_func == NULL || symbol_func == NULL)
                goto leave;
 
@@ -395,6 +369,7 @@ mono_dl_fallback_register_internal (MonoDlFallbackLoad load_func, MonoDlFallback
        fallback_handlers = g_slist_prepend (fallback_handlers, handler);
        
 leave:
+       MONO_EXIT_GC_UNSAFE;
        return handler;
 }
 
index a9b5c53..e91a561 100644 (file)
@@ -51,8 +51,5 @@ char* mono_dl_current_error_string (void);
 int mono_dl_get_executable_path (char *buf, int buflen);
 const char* mono_dl_get_system_dir (void);
 
-void* mono_dl_symbol_default (MonoDl *module, const char *name);
-MonoDlFallbackHandler* mono_dl_fallback_register_internal (MonoDlFallbackLoad load_func, MonoDlFallbackSymbol symbol_func, MonoDlFallbackClose close_func, void *user_data);
-
 #endif /* __MONO_UTILS_DL_H__ */