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

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp')
-rw-r--r--src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp b/src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp
index dfb2917f2..d46e3da95 100644
--- a/src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp
+++ b/src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp
@@ -2,10 +2,38 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+#include "pal_common.h"
#include <dlfcn.h>
+#include <string.h>
+
+#if HAVE_GNU_LIBNAMES_H
+#include <gnu/lib-names.h>
+#endif
extern "C" void* CoreLibNative_LoadLibrary(const char* filename)
{
+ // Check whether we have been requested to load 'libc'. If that's the case, then:
+ // * For Linux, use the full name of the library that is defined in <gnu/lib-names.h> by the
+ // LIBC_SO constant. The problem is that calling dlopen("libc.so") will fail for libc even
+ // though it works for other libraries. The reason is that libc.so is just linker script
+ // (i.e. a test file).
+ // As a result, we have to use the full name (i.e. lib.so.6) that is defined by LIBC_SO.
+ // * For macOS, use constant value absolute path "/usr/lib/libc.dylib".
+ // * For FreeBSD, use constant value "libc.so.7".
+ // * For rest of Unices, use constant value "libc.so".
+ if (strcmp(filename, "libc") == 0)
+ {
+#if defined(__APPLE__)
+ filename = "/usr/lib/libc.dylib";
+#elif defined(__FreeBSD__)
+ filename = "libc.so.7";
+#elif defined(LIBC_SO)
+ filename = LIBC_SO;
+#else
+ filename = "libc.so";
+#endif
+ }
+
return dlopen(filename, RTLD_LAZY);
}