diff options
Diffstat (limited to 'src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp')
-rw-r--r-- | src/Native/System.Private.CoreLib.Native/pal_dynamicload.cpp | 28 |
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); } |