summaryrefslogtreecommitdiff
path: root/libnativeloader/open_system_library.cpp
diff options
context:
space:
mode:
author Lev Rumyantsev <levarum@google.com> 2023-04-27 23:21:33 +0000
committer Lev Rumyantsev <levarum@google.com> 2023-04-29 02:57:52 +0000
commitb2b067192ac047b99c0d03104c5d7dbf79192ef1 (patch)
tree21222cca901ccd1ff46c1ce859ec4bc5caa486be /libnativeloader/open_system_library.cpp
parent7f5b3d89f21edd958ddb9d7bd01e03c77bd5425a (diff)
libnativeloader_test: link non-public libs statically
Non-public NDK libs are not supposed to be tested in CTS. Specifically native-bridged execution (e.g. arm on x86) doesn't support this. The awkward thing here is that the test redefines all libnativebridge symbols, but still links shared libnativebridge to call its OpenSystemLibrary. Due to symbols duplication we cannot simply convert libnativebridge to static. Instead, as a quick fix, we copy OpenSystemLibrary implementation from native_bridge.cpp. We expect that one of the codebase owners will find a better way to share OpenSystemLibrary later. Test: cts-tradefed run cts -m libnativeloader_tests (arm on x86) Bug: b/268440713 Change-Id: I7c651200567a299742e7604ee07b043713ca1fec
Diffstat (limited to 'libnativeloader/open_system_library.cpp')
-rw-r--r--libnativeloader/open_system_library.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/libnativeloader/open_system_library.cpp b/libnativeloader/open_system_library.cpp
new file mode 100644
index 0000000000..63175aa91f
--- /dev/null
+++ b/libnativeloader/open_system_library.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "nativeloader_test"
+
+#include <dlfcn.h>
+#include <log/log.h>
+
+#ifdef ART_TARGET_ANDROID
+#include "nativeloader/dlext_namespaces.h"
+#endif
+
+namespace android {
+
+extern "C" {
+
+// TODO(b/268440756): Find a way to reuse it from libnativebridge.
+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");
+ const char* message = "Failed to get system namespace for loading %s";
+ LOG_ALWAYS_FATAL_IF(system_ns == nullptr, message, 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
+}
+
+} // extern "C"
+
+} // namespace android