diff options
Diffstat (limited to 'libc/bionic/malloc_common_dynamic.cpp')
| -rw-r--r-- | libc/bionic/malloc_common_dynamic.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/libc/bionic/malloc_common_dynamic.cpp b/libc/bionic/malloc_common_dynamic.cpp index 3ccaed673..e7147a0e8 100644 --- a/libc/bionic/malloc_common_dynamic.cpp +++ b/libc/bionic/malloc_common_dynamic.cpp @@ -54,6 +54,8 @@ #include <stdlib.h> #include <unistd.h> +#include <android/dlext.h> + #include <private/bionic_config.h> #include <private/bionic_defs.h> #include <private/bionic_malloc_dispatch.h> @@ -277,8 +279,41 @@ bool InitSharedLibrary(void* impl_handle, const char* shared_lib, const char* pr return true; } +// Note about USE_SCUDO. This file is compiled into libc.so and libc_scudo.so. +// When compiled into libc_scudo.so, the libc_malloc_* libraries don't need +// to be loaded from the runtime namespace since libc_scudo.so is not from +// the runtime APEX, but is copied to any APEX that needs it. +#ifndef USE_SCUDO +extern "C" struct android_namespace_t* android_get_exported_namespace(const char* name); +#endif + void* LoadSharedLibrary(const char* shared_lib, const char* prefix, MallocDispatch* dispatch_table) { - void* impl_handle = dlopen(shared_lib, RTLD_NOW | RTLD_LOCAL); + void* impl_handle = nullptr; +#ifndef USE_SCUDO + // Try to load the libc_malloc_* libs from the "runtime" namespace and then + // fall back to dlopen() to load them from the default namespace. + // + // The libraries are packaged in the runtime APEX together with libc.so. + // However, since the libc.so is searched via the symlink in the system + // partition (/system/lib/libc.so -> /apex/com.android.runtime/bionic.libc.so) + // libc.so is loaded into the default namespace. If we just dlopen() here, the + // linker will load the libs found in /system/lib which might be incompatible + // with libc.so in the runtime APEX. Use android_dlopen_ext to explicitly load + // the ones in the runtime APEX. + struct android_namespace_t* runtime_ns = android_get_exported_namespace("runtime"); + if (runtime_ns != nullptr) { + const android_dlextinfo dlextinfo = { + .flags = ANDROID_DLEXT_USE_NAMESPACE, + .library_namespace = runtime_ns, + }; + impl_handle = android_dlopen_ext(shared_lib, RTLD_NOW | RTLD_LOCAL, &dlextinfo); + } +#endif + + if (impl_handle == nullptr) { + impl_handle = dlopen(shared_lib, RTLD_NOW | RTLD_LOCAL); + } + if (impl_handle == nullptr) { error_log("%s: Unable to open shared library %s: %s", getprogname(), shared_lib, dlerror()); return nullptr; |
