aboutsummaryrefslogtreecommitdiff
path: root/libc/bionic/malloc_common_dynamic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libc/bionic/malloc_common_dynamic.cpp')
-rw-r--r--libc/bionic/malloc_common_dynamic.cpp37
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;