diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2015-04-01 14:45:10 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2015-04-02 14:12:45 -0700 |
commit | 76ac1acdacc045cf1e56504e011dca68137dcd61 (patch) | |
tree | 9eb3bee0f92ae74f1eba59efad4c037d50aa3dcd /tests | |
parent | ab7c79e22e5495a2aa171047a044ce1037e461a9 (diff) | |
download | bionic-76ac1acdacc045cf1e56504e011dca68137dcd61.zip bionic-76ac1acdacc045cf1e56504e011dca68137dcd61.tar.gz bionic-76ac1acdacc045cf1e56504e011dca68137dcd61.tar.bz2 |
Look into local group on dlsym with RTLD_DEFAULT
Fix dlsym to look into local group when called with
RTLD_DEFAULT and RTLD_NEXT.
Bug: 17512583
Change-Id: I541354e89539c712af2ea4ec751e546913027084
Diffstat (limited to 'tests')
-rw-r--r-- | tests/dlfcn_test.cpp | 23 | ||||
-rw-r--r-- | tests/libs/Android.mk | 9 | ||||
-rw-r--r-- | tests/libs/dlsym_from_this.cpp | 30 |
3 files changed, 61 insertions, 1 deletions
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index 1061e84..a63c070 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -46,7 +46,7 @@ TEST(dlfcn, ctor_function_call) { ASSERT_EQ(17, g_ctor_function_called); } -TEST(dlfcn, dlsym_in_self) { +TEST(dlfcn, dlsym_in_executable) { dlerror(); // Clear any pending errors. void* self = dlopen(NULL, RTLD_NOW); ASSERT_TRUE(self != NULL); @@ -64,6 +64,27 @@ TEST(dlfcn, dlsym_in_self) { ASSERT_EQ(0, dlclose(self)); } +TEST(dlfcn, dlsym_from_sofile) { + void* handle = dlopen("libtest_dlsym_from_this.so", RTLD_LAZY | RTLD_LOCAL); + ASSERT_TRUE(handle != nullptr) << dlerror(); + + // check that we cant find '_test_dlsym_symbol' via dlsym(RTLD_DEFAULT) + void* symbol = dlsym(RTLD_DEFAULT, "test_dlsym_symbol"); + ASSERT_TRUE(symbol == nullptr); + ASSERT_SUBSTR("undefined symbol: test_dlsym_symbol", dlerror()); + + typedef int* (*fn_t)(); + fn_t fn = reinterpret_cast<fn_t>(dlsym(handle, "lookup_dlsym_symbol_using_RTLD_DEFAULT")); + + ASSERT_TRUE(fn != nullptr) << dlerror(); + + int* ptr = fn(); + ASSERT_TRUE(ptr != nullptr) << dlerror(); + ASSERT_EQ(42, *ptr); + + dlclose(handle); +} + TEST(dlfcn, dlsym_with_dependencies) { void* handle = dlopen("libtest_with_dependency.so", RTLD_NOW); ASSERT_TRUE(handle != NULL); diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk index 665ce0c..eb0a52a 100644 --- a/tests/libs/Android.mk +++ b/tests/libs/Android.mk @@ -371,6 +371,15 @@ module := libtest_dlsym_weak_func include $(LOCAL_PATH)/Android.build.testlib.mk # ----------------------------------------------------------------------------- +# Library to check RTLD_LOCAL with dlsym in 'this' +# ----------------------------------------------------------------------------- +libtest_dlsym_from_this_src_files := dlsym_from_this.cpp + +module := libtest_dlsym_from_this + +include $(LOCAL_PATH)/Android.build.testlib.mk + +# ----------------------------------------------------------------------------- # Library with weak undefined function # ----------------------------------------------------------------------------- libtest_dlopen_weak_undefined_func_src_files := \ diff --git a/tests/libs/dlsym_from_this.cpp b/tests/libs/dlsym_from_this.cpp new file mode 100644 index 0000000..b5215c9 --- /dev/null +++ b/tests/libs/dlsym_from_this.cpp @@ -0,0 +1,30 @@ +/* + * 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. + */ +#include <dlfcn.h> +#include <stdio.h> + +int test_dlsym_symbol = 42; + +extern "C" int* lookup_dlsym_symbol_using_RTLD_DEFAULT() { + dlerror(); + int* result = static_cast<int*>(dlsym(RTLD_DEFAULT, "test_dlsym_symbol")); + // TODO: remove this once b/20049306 is fixed + if (result == nullptr) { + printf("Cannot find the answer\n"); + } + return result; +} + |