From bfa88bca5ca387d6b3560074050856527cfc7514 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Tue, 16 Dec 2014 11:40:46 -0800 Subject: Add another test for weak-reference This one covers undefined weak reference in .so referenced via JUMP_SLOT relocation. Bug: 17526061 Change-Id: Ib8764bd30c1f686c4818ebbc6683cf42dee908b2--- tests/dlfcn_test.cpp | 14 +++++++++++++- tests/libs/Android.mk | 9 +++++++++ tests/libs/dlopen_weak_undefined.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/libs/dlopen_weak_undefined.cpp diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index c988d29d..6fdfdc75 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -819,7 +819,7 @@ TEST(dlfcn, rtld_next_known_symbol) { TEST(dlfcn, dlsym_weak_func) { dlerror(); - void* handle = dlopen("libtest_dlsym_weak_func.so",RTLD_NOW); + void* handle = dlopen("libtest_dlsym_weak_func.so", RTLD_NOW); ASSERT_TRUE(handle != NULL); int (*weak_func)(); @@ -829,6 +829,18 @@ TEST(dlfcn, dlsym_weak_func) { dlclose(handle); } +TEST(dlfcn, dlopen_undefined_weak_func) { + test_isolated([] { + void* handle = dlopen("libtest_dlopen_weak_undefined_func.so", RTLD_NOW); + ASSERT_TRUE(handle != nullptr) << dlerror(); + int (*weak_func)(); + weak_func = reinterpret_cast(dlsym(handle, "use_weak_undefined_func")); + ASSERT_TRUE(weak_func != nullptr) << dlerror(); + EXPECT_EQ(6551, weak_func()); + dlclose(handle); + }); +} + TEST(dlfcn, dlopen_symlink) { void* handle1 = dlopen("libdlext_test.so", RTLD_NOW); void* handle2 = dlopen("libdlext_test_v2.so", RTLD_NOW); diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk index e4620f57..50d96b2b 100644 --- a/tests/libs/Android.mk +++ b/tests/libs/Android.mk @@ -358,3 +358,12 @@ libtest_dlsym_weak_func_src_files := \ module := libtest_dlsym_weak_func include $(LOCAL_PATH)/Android.build.testlib.mk + +# ----------------------------------------------------------------------------- +# Library with weak undefined function +# ----------------------------------------------------------------------------- +libtest_dlopen_weak_undefined_func_src_files := \ + dlopen_weak_undefined.cpp + +module := libtest_dlopen_weak_undefined_func +include $(LOCAL_PATH)/Android.build.testlib.mk diff --git a/tests/libs/dlopen_weak_undefined.cpp b/tests/libs/dlopen_weak_undefined.cpp new file mode 100644 index 00000000..599a52e6 --- /dev/null +++ b/tests/libs/dlopen_weak_undefined.cpp @@ -0,0 +1,25 @@ +/* + * 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. + */ + +extern "C" int __attribute__((weak)) weak_undefined_func(); + +extern "C" int use_weak_undefined_func() { + if (weak_undefined_func) { + return weak_undefined_func(); + } else { + return 6551; + } +} -- cgit v1.2.3-54-g00ecf