Skip to content

Commit

Permalink
[native-library] If a dllimport is specified with an absolute path, l…
Browse files Browse the repository at this point in the history
…ook for it first

The unmanaged native library probing documentation says to try
absolute paths without variations

https://learn.microsoft.com/en-us/dotnet/core/dependency-loading/default-probing#unmanaged-native-library-probing

Manual backport of  dotnet#85255 to net6
  • Loading branch information
lambdageek committed Apr 24, 2023
1 parent a81beb7 commit 730fd83
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions src/mono/mono/metadata/native-library.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,11 +518,18 @@ netcore_probe_for_module (MonoImage *image, const char *file_name, int flags)
// TODO: this algorithm doesn't quite match CoreCLR, so respecting DLLIMPORTSEARCHPATH_LEGACY_BEHAVIOR makes little sense
// If the difference becomes a problem, overhaul this algorithm to match theirs exactly

gboolean probe_first_without_prepend = FALSE;

#if defined(HOST_ANDROID)
// On Android, try without any path additions first. It is sensitive to probing that will always miss
// and lookup for some libraries is required to use a relative path
module = netcore_probe_for_module_variations (NULL, file_name, lflags);
probe_first_without_prepend = TRUE;
#else
if (file_name != NULL && g_path_is_absolute (file_name))
probe_first_without_prepend = TRUE;
#endif
if (module == NULL && probe_first_without_prepend)
module = netcore_probe_for_module_variations (NULL, file_name, lflags);

// Check the NATIVE_DLL_SEARCH_DIRECTORIES
for (int i = 0; i < pinvoke_search_directories_count && module == NULL; ++i)
Expand All @@ -537,13 +544,11 @@ netcore_probe_for_module (MonoImage *image, const char *file_name, int flags)
g_free (mdirname);
}

#if !defined(HOST_ANDROID)
// Try without any path additions
if (module == NULL)
// Try without any path additions, if we didn't try it already
if (module == NULL && !probe_first_without_prepend)
{
module = netcore_probe_for_module_variations (NULL, file_name, lflags);
}
#endif

// TODO: Pass remaining flags on to LoadLibraryEx on Windows where appropriate, see https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.dllimportsearchpath?view=netcore-3.1

Expand Down

0 comments on commit 730fd83

Please sign in to comment.