From acf5aa76a56f101607aeb8e6d1fbea24d0d4f68c Mon Sep 17 00:00:00 2001 From: jeffhao Date: Wed, 12 Sep 2012 17:25:30 -0700 Subject: [PATCH] Added new test for dlopen which is failing for MIPS. Change-Id: I2240faefb387a11647f49b1a15699907a40f98c1 --- tests/Android.mk | 17 ++++++++++++----- tests/dlopen_test.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 tests/dlopen_test.cpp diff --git a/tests/Android.mk b/tests/Android.mk index ae57d9bfb..a97334175 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -23,22 +23,28 @@ test_src_files = \ pthread_test.cpp \ regex_test.cpp \ +test_dynamic_ldflags = -Wl,--export-dynamic -Wl,-u,DlSymTestFunction +test_dynamic_src_files = \ + dlopen_test.cpp \ + # Build for the device (with bionic's .so). Run with: # adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests include $(CLEAR_VARS) LOCAL_MODULE := bionic-unit-tests LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk -LOCAL_SRC_FILES := $(test_src_files) +LOCAL_LDFLAGS += $(test_dynamic_ldflags) +LOCAL_SHARED_LIBRARIES += libdl +LOCAL_SRC_FILES := $(test_src_files) $(test_dynamic_src_files) include $(BUILD_NATIVE_TEST) # Build for the device (with bionic's .a). Run with: # adb shell /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static include $(CLEAR_VARS) -LOCAL_FORCE_STATIC_EXECUTABLE := true -LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc LOCAL_MODULE := bionic-unit-tests-static LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk +LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_SRC_FILES := $(test_src_files) +LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc include $(BUILD_NATIVE_TEST) # Build for the host (with glibc). @@ -48,8 +54,9 @@ include $(BUILD_NATIVE_TEST) include $(CLEAR_VARS) LOCAL_MODULE := bionic-unit-tests-glibc LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk -LOCAL_LDFLAGS += -lpthread -LOCAL_SRC_FILES := $(test_src_files) +LOCAL_LDFLAGS += -lpthread -ldl +LOCAL_LDFLAGS += $(test_dynamic_ldflags) +LOCAL_SRC_FILES := $(test_src_files) $(test_dynamic_src_files) include $(BUILD_HOST_NATIVE_TEST) endif # !BUILD_TINY_ANDROID diff --git a/tests/dlopen_test.cpp b/tests/dlopen_test.cpp new file mode 100644 index 000000000..c290b4d37 --- /dev/null +++ b/tests/dlopen_test.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2012 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 + +#include + +static bool gCalled = false; +extern "C" void DlSymTestFunction() { + gCalled = true; +} + +TEST(dlopen, dlsym_in_self) { + void* self = dlopen(NULL, RTLD_NOW); + ASSERT_TRUE(self != NULL); + + void* sym = dlsym(self, "DlSymTestFunction"); + ASSERT_TRUE(sym != NULL); + + void (*function)() = reinterpret_cast(sym); + + gCalled = false; + function(); + ASSERT_TRUE(gCalled); +}