summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/dlfcn_test.cpp28
-rw-r--r--tests/libs/Android.mk8
2 files changed, 34 insertions, 2 deletions
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index a5abda7..3c9b8e3 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -145,13 +145,28 @@ TEST(dlfcn, dlsym_from_sofile_with_preload) {
dlclose(preload);
}
+TEST(dlfcn, dlsym_handle_global_sym) {
+ // check that we do not look into global group
+ // when looking up symbol by handle
+ void* handle = dlopen("libtest_empty.so", RTLD_NOW);
+ dlopen("libtest_with_dependency.so", RTLD_NOW | RTLD_GLOBAL);
+ void* sym = dlsym(handle, "getRandomNumber");
+ ASSERT_TRUE(sym == nullptr);
+ ASSERT_SUBSTR("undefined symbol: getRandomNumber", dlerror());
+
+ sym = dlsym(handle, "DlSymTestFunction");
+ ASSERT_TRUE(sym == nullptr);
+ ASSERT_SUBSTR("undefined symbol: DlSymTestFunction", dlerror());
+ dlclose(handle);
+}
+
TEST(dlfcn, dlsym_with_dependencies) {
void* handle = dlopen("libtest_with_dependency.so", RTLD_NOW);
- ASSERT_TRUE(handle != NULL);
+ ASSERT_TRUE(handle != nullptr);
dlerror();
// This symbol is in DT_NEEDED library.
void* sym = dlsym(handle, "getRandomNumber");
- ASSERT_TRUE(sym != NULL);
+ ASSERT_TRUE(sym != nullptr) << dlerror();
int (*fn)(void);
fn = reinterpret_cast<int (*)(void)>(sym);
EXPECT_EQ(4, fn());
@@ -583,6 +598,15 @@ TEST(dlfcn, dlopen_check_rtld_global) {
// RTLD_GLOBAL implies RTLD_NODELETE, let's check that
void* sym_after_dlclose = dlsym(RTLD_DEFAULT, "dlopen_testlib_simple_func");
ASSERT_EQ(sym, sym_after_dlclose);
+
+ // Check if dlsym() for main program's handle searches RTLD_GLOBAL
+ // shared libraries after symbol was not found in the main executable
+ // and dependent libraries.
+ void* handle_for_main_executable = dlopen(nullptr, RTLD_NOW);
+ sym = dlsym(handle_for_main_executable, "dlopen_testlib_simple_func");
+ ASSERT_TRUE(sym != nullptr) << dlerror();
+
+ dlclose(handle_for_main_executable);
}
// libtest_with_dependency_loop.so -> libtest_with_dependency_loop_a.so ->
diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk
index 15fa55c..a5ef622 100644
--- a/tests/libs/Android.mk
+++ b/tests/libs/Android.mk
@@ -405,6 +405,14 @@ module := libtest_dlsym_from_this_grandchild
include $(LOCAL_PATH)/Android.build.testlib.mk
# -----------------------------------------------------------------------------
+# Empty library
+# -----------------------------------------------------------------------------
+libtest_empty_src_files := empty.cpp
+
+module := libtest_empty
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# -----------------------------------------------------------------------------
# Library with weak undefined function
# -----------------------------------------------------------------------------
libtest_dlopen_weak_undefined_func_src_files := \