From b3356773c6b5fbbbb26d22b3d6c6e0e598840e44 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Fri, 14 Nov 2014 11:19:22 -0800 Subject: [PATCH] Add test for --hash-style=sysv With build system switched to gnu-hash we need a test for sysv-hashed library. Change-Id: I34adc216fa79199aa46066cf13fcc1c1f2581f0e --- tests/Android.mk | 2 -- tests/dlfcn_test.cpp | 22 +++++++++++++++++++++- tests/libs/Android.mk | 15 ++++++++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/tests/Android.mk b/tests/Android.mk index 5e0c593f7..14a5e8331 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -301,9 +301,7 @@ bionic-unit-tests-glibc_shared_libraries := \ libdl_preempt_test_1 \ libdl_preempt_test_2 -ifneq ($(filter $(TARGET_ARCH),arm arm64),$(TARGET_ARCH)) bionic-unit-tests-glibc_shared_libraries += libdl_test_df_1_global -endif bionic-unit-tests-glibc_whole_static_libraries := \ libBionicStandardTests \ diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index cd97d55d1..88f0b197c 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -669,12 +669,32 @@ TEST(dlfcn, dlopen_library_with_only_gnu_hash) { ASSERT_TRUE(fn == dlinfo.dli_saddr); ASSERT_STREQ("getRandomNumber", dlinfo.dli_sname); - ASSERT_STREQ("libgnu-hash-table-library.so", dlinfo.dli_fname); + ASSERT_SUBSTR("libgnu-hash-table-library.so", dlinfo.dli_fname); #else GTEST_LOG_(INFO) << "This test does nothing for mips/mips64; mips toolchain does not support '--hash-style=gnu'\n"; #endif } +TEST(dlfcn, dlopen_library_with_only_sysv_hash) { + void* handle = dlopen("libsysv-hash-table-library.so", RTLD_NOW); + ASSERT_TRUE(handle != nullptr) << dlerror(); + auto guard = make_scope_guard([&]() { + dlclose(handle); + }); + void* sym = dlsym(handle, "getRandomNumber"); + ASSERT_TRUE(sym != nullptr) << dlerror(); + int (*fn)(void); + fn = reinterpret_cast(sym); + EXPECT_EQ(4, fn()); + + Dl_info dlinfo; + ASSERT_TRUE(0 != dladdr(reinterpret_cast(fn), &dlinfo)); + + ASSERT_TRUE(fn == dlinfo.dli_saddr); + ASSERT_STREQ("getRandomNumber", dlinfo.dli_sname); + ASSERT_SUBSTR("libsysv-hash-table-library.so", dlinfo.dli_fname); +} + TEST(dlfcn, dlopen_bad_flags) { dlerror(); // Clear any pending errors. void* handle; diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk index 0793019d1..777ae4ba5 100644 --- a/tests/libs/Android.mk +++ b/tests/libs/Android.mk @@ -28,7 +28,7 @@ common_additional_dependencies := \ $(TEST_PATH)/Android.build.mk # ----------------------------------------------------------------------------- -# Library used by dlfcn tests. +# Library to test gnu-styled hash # ----------------------------------------------------------------------------- ifneq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64)) libgnu-hash-table-library_src_files := \ @@ -42,6 +42,19 @@ module_tag := optional include $(LOCAL_PATH)/Android.build.testlib.mk endif +# ----------------------------------------------------------------------------- +# Library to test sysv-styled hash +# ----------------------------------------------------------------------------- +libsysv-hash-table-library_src_files := \ + dlext_test_library.cpp \ + +libsysv-hash-table-library_ldflags := \ + -Wl,--hash-style=sysv \ + +module := libsysv-hash-table-library +module_tag := optional +include $(LOCAL_PATH)/Android.build.testlib.mk + # ----------------------------------------------------------------------------- # Library used by dlext tests - with GNU RELRO program header # -----------------------------------------------------------------------------