diff options
Diffstat (limited to 'libnativebridge/native_bridge.cc')
-rw-r--r-- | libnativebridge/native_bridge.cc | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/libnativebridge/native_bridge.cc b/libnativebridge/native_bridge.cc index 46a05a23bf..fb13d62be0 100644 --- a/libnativebridge/native_bridge.cc +++ b/libnativebridge/native_bridge.cc @@ -31,6 +31,10 @@ #include <android-base/macros.h> #include <log/log.h> +#ifdef ART_TARGET_ANDROID +#include "nativeloader/dlext_namespaces.h" +#endif + namespace android { #ifdef __APPLE__ @@ -40,6 +44,28 @@ void UNUSED(const T&) {} extern "C" { +void* OpenSystemLibrary(const char* path, int flags) { +#ifdef ART_TARGET_ANDROID + // The system namespace is called "default" for binaries in /system and + // "system" for those in the Runtime APEX. Try "system" first since + // "default" always exists. + // TODO(b/185587109): Get rid of this error prone logic. + android_namespace_t* system_ns = android_get_exported_namespace("system"); + if (system_ns == nullptr) { + system_ns = android_get_exported_namespace("default"); + LOG_ALWAYS_FATAL_IF(system_ns == nullptr, + "Failed to get system namespace for loading %s", path); + } + const android_dlextinfo dlextinfo = { + .flags = ANDROID_DLEXT_USE_NAMESPACE, + .library_namespace = system_ns, + }; + return android_dlopen_ext(path, flags, &dlextinfo); +#else + return dlopen(path, flags); +#endif +} + // Environment values required by the apps running with native bridge. struct NativeBridgeRuntimeValues { const char* os_arch; @@ -223,8 +249,12 @@ bool LoadNativeBridge(const char* nb_library_filename, if (!NativeBridgeNameAcceptable(nb_library_filename)) { CloseNativeBridge(true); } else { - // Try to open the library. - void* handle = dlopen(nb_library_filename, RTLD_LAZY); + // Try to open the library. We assume this library is provided by the + // platform rather than the ART APEX itself, so use the system namespace + // to avoid requiring a static linker config link to it from the + // com_android_art namespace. + void* handle = OpenSystemLibrary(nb_library_filename, RTLD_LAZY); + if (handle != nullptr) { callbacks = reinterpret_cast<NativeBridgeCallbacks*>(dlsym(handle, kNativeBridgeInterfaceSymbol)); |