Add ANDROID_DLEXT_FORCE_LOAD flag
This flag allows to force loading of the library
in the case when for some reason multiple ELF files
share the same filename (because the already-loaded
library has been removed and overwritten, for example).
Change-Id: I798d44409ee13d63eaa75d685e99c4d028d2b0c1
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index ca6a75a..700abff 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -173,6 +173,40 @@
ASSERT_STREQ("dlopen failed: invalid extended flag combination (ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET without ANDROID_DLEXT_USE_LIBRARY_FD): 0x20", dlerror());
}
+TEST(dlext, android_dlopen_ext_force_load_smoke) {
+ // 1. Open actual file
+ void* handle = dlopen("libdlext_test.so", RTLD_NOW);
+ ASSERT_DL_NOTNULL(handle);
+ // 2. Open link with force_load flag set
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_FORCE_LOAD;
+ void* handle2 = android_dlopen_ext("libdlext_test_v2.so", RTLD_NOW, &extinfo);
+ ASSERT_DL_NOTNULL(handle2);
+ ASSERT_TRUE(handle != handle2);
+
+ dlclose(handle2);
+ dlclose(handle);
+}
+
+TEST(dlext, android_dlopen_ext_force_load_soname_exception) {
+ // Check if soname lookup still returns already loaded library
+ // when ANDROID_DLEXT_FORCE_LOAD flag is specified.
+ void* handle = dlopen("libdlext_test_v2.so", RTLD_NOW);
+ ASSERT_DL_NOTNULL(handle);
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_FORCE_LOAD;
+
+ // Note that 'libdlext_test.so' is dt_soname for libdlext_test_v2.so
+ void* handle2 = android_dlopen_ext("libdlext_test.so", RTLD_NOW, &extinfo);
+
+ ASSERT_DL_NOTNULL(handle2);
+ ASSERT_TRUE(handle == handle2);
+
+ dlclose(handle2);
+ dlclose(handle);
+}
+
TEST(dlfcn, dlopen_from_zip_absolute_path) {
const std::string lib_path = std::string(getenv("ANDROID_DATA")) + LIBZIPPATH;