f439b5a318
According to man dlopen(3) and posix docs in the case when si is handle of the main executable we need to search not only in the executable and its dependencies but also in all libraries loaded with RTLD_GLOBAL. see also: http://pubs.opengroup.org/onlinepubs/9699919799/functions/dlopen.html Bug: http://b/21528224 Bug: http://b/17512583 Bug: https://code.google.com/p/android/issues/detail?id=173822 Change-Id: Ib2801367ba48b6f3704da89a6d9f5e6911430013
444 lines
18 KiB
Makefile
444 lines
18 KiB
Makefile
#
|
|
# 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.
|
|
#
|
|
|
|
LOCAL_PATH := $(call my-dir)
|
|
TEST_PATH := $(LOCAL_PATH)/..
|
|
|
|
common_cppflags += -std=gnu++11
|
|
common_additional_dependencies := \
|
|
$(LOCAL_PATH)/Android.mk \
|
|
$(LOCAL_PATH)/Android.build.dlext_testzip.mk \
|
|
$(LOCAL_PATH)/Android.build.dlopen_2_parents_reloc.mk \
|
|
$(LOCAL_PATH)/Android.build.dlopen_check_order_dlsym.mk \
|
|
$(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_siblings.mk \
|
|
$(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_main_executable.mk \
|
|
$(LOCAL_PATH)/Android.build.pthread_atfork.mk \
|
|
$(LOCAL_PATH)/Android.build.testlib.mk \
|
|
$(LOCAL_PATH)/Android.build.versioned_lib.mk \
|
|
$(TEST_PATH)/Android.build.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library to test gnu-styled hash
|
|
# -----------------------------------------------------------------------------
|
|
ifneq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64))
|
|
libgnu-hash-table-library_src_files := \
|
|
dlext_test_library.cpp \
|
|
|
|
libgnu-hash-table-library_ldflags := \
|
|
-Wl,--hash-style=gnu \
|
|
|
|
module := libgnu-hash-table-library
|
|
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
|
|
# -----------------------------------------------------------------------------
|
|
libdlext_test_src_files := \
|
|
dlext_test_library.cpp \
|
|
|
|
libdlext_test_ldflags := \
|
|
-Wl,-z,relro \
|
|
|
|
module := libdlext_test
|
|
module_tag := optional
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# create symlink to libdlext_test.so for symlink test
|
|
# -----------------------------------------------------------------------------
|
|
# Use = instead of := to defer the evaluation of $@
|
|
$(TARGET_OUT)/lib/libdlext_test.so: PRIVATE_POST_INSTALL_CMD = \
|
|
$(hide) cd $(dir $@) && ln -sf $(notdir $@) libdlext_test_v2.so
|
|
|
|
ifneq ($(TARGET_2ND_ARCH),)
|
|
# link 64 bit .so
|
|
$(TARGET_OUT)/lib64/libdlext_test.so: PRIVATE_POST_INSTALL_CMD = \
|
|
$(hide) cd $(dir $@) && ln -sf $(notdir $@) libdlext_test_v2.so
|
|
endif
|
|
|
|
# host symlinks
|
|
$(HOST_OUT)/lib64/libdlext_test.so: PRIVATE_POST_INSTALL_CMD = \
|
|
$(hide) cd $(dir $@) && ln -sf $(notdir $@) libdlext_test_v2.so
|
|
|
|
$(HOST_OUT)/lib/libdlext_test.so: PRIVATE_POST_INSTALL_CMD = \
|
|
$(hide) cd $(dir $@) && ln -sf $(notdir $@) libdlext_test_v2.so
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlext tests - without GNU RELRO program header
|
|
# -----------------------------------------------------------------------------
|
|
libdlext_test_norelro_src_files := \
|
|
dlext_test_library.cpp \
|
|
|
|
libdlext_test_norelro_ldflags := \
|
|
-Wl,-z,norelro \
|
|
|
|
module := libdlext_test_norelro
|
|
module_tag := optional
|
|
build_type := target
|
|
build_target := SHARED_LIBRARY
|
|
include $(TEST_PATH)/Android.build.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlext tests - different name non-default location
|
|
# -----------------------------------------------------------------------------
|
|
libdlext_test_fd_src_files := \
|
|
dlext_test_library.cpp \
|
|
|
|
libdlext_test_fd_install_to_out_data := true
|
|
module := libdlext_test_fd
|
|
module_tag := optional
|
|
build_type := target
|
|
build_target := SHARED_LIBRARY
|
|
include $(TEST_PATH)/Android.build.mk
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Library with soname which does not match filename
|
|
# ----------------------------------------------------------------------------
|
|
libdlext_test_different_soname_src_files := \
|
|
dlext_test_library.cpp \
|
|
|
|
module := libdlext_test_different_soname
|
|
module_tag := optional
|
|
libdlext_test_different_soname_ldflags := -Wl,-soname=libdlext_test_soname.so
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlext tests - zipped and aligned
|
|
# -----------------------------------------------------------------------------
|
|
include $(CLEAR_VARS)
|
|
bionic_2nd_arch_prefix :=
|
|
include $(LOCAL_PATH)/Android.build.dlext_testzip.mk
|
|
ifneq ($(TARGET_2ND_ARCH),)
|
|
bionic_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
|
|
include $(LOCAL_PATH)/Android.build.dlext_testzip.mk
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlfcn tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_simple_src_files := \
|
|
dlopen_testlib_simple.cpp
|
|
|
|
module := libtest_simple
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlfcn nodelete tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_nodelete_1_src_files := \
|
|
dlopen_nodelete_1.cpp
|
|
|
|
module := libtest_nodelete_1
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlfcn nodelete tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_nodelete_2_src_files := \
|
|
dlopen_nodelete_2.cpp
|
|
|
|
module := libtest_nodelete_2
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by dlfcn nodelete tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_nodelete_dt_flags_1_src_files := \
|
|
dlopen_nodelete_dt_flags_1.cpp
|
|
|
|
libtest_nodelete_dt_flags_1_ldflags := -Wl,-z,nodelete
|
|
|
|
module := libtest_nodelete_dt_flags_1
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build library with two parents
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.dlopen_2_parents_reloc.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build libtest_check_order_dlsym.so with its dependencies.
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.dlopen_check_order_dlsym.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build libtest_check_order_siblings.so with its dependencies.
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_siblings.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build libtest_check_order_root.so with its dependencies.
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_main_executable.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build libtest_versioned_lib.so with its dependencies.
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.versioned_lib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Build libraries needed by pthread_atfork tests
|
|
# -----------------------------------------------------------------------------
|
|
include $(LOCAL_PATH)/Android.build.pthread_atfork.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library with dependency loop used by dlfcn tests
|
|
#
|
|
# libtest_with_dependency_loop -> a -> b -> c -> a
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_loop_src_files := dlopen_testlib_loopy_root.cpp
|
|
|
|
libtest_with_dependency_loop_shared_libraries := \
|
|
libtest_with_dependency_loop_a
|
|
|
|
module := libtest_with_dependency_loop
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# libtest_with_dependency_loop_a.so
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_loop_a_src_files := dlopen_testlib_loopy_a.cpp
|
|
|
|
libtest_with_dependency_loop_a_shared_libraries := \
|
|
libtest_with_dependency_loop_b_tmp
|
|
|
|
module := libtest_with_dependency_loop_a
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# libtest_with_dependency_loop_b.so
|
|
#
|
|
# this is temporary placeholder - will be removed
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_loop_b_tmp_src_files := dlopen_testlib_loopy_invalid.cpp
|
|
libtest_with_dependency_loop_b_tmp_ldflags := -Wl,-soname=libtest_with_dependency_loop_b.so
|
|
|
|
module := libtest_with_dependency_loop_b_tmp
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# libtest_with_dependency_loop_b.so
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_loop_b_src_files := dlopen_testlib_loopy_b.cpp
|
|
libtest_with_dependency_loop_b_shared_libraries := libtest_with_dependency_loop_c
|
|
|
|
module := libtest_with_dependency_loop_b
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# libtest_with_dependency_loop_c.so
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_loop_c_src_files := dlopen_testlib_loopy_c.cpp
|
|
|
|
libtest_with_dependency_loop_c_shared_libraries := \
|
|
libtest_with_dependency_loop_a
|
|
|
|
module := libtest_with_dependency_loop_c
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# libtest_relo_check_dt_needed_order.so
|
|
# |
|
|
# +-> libtest_relo_check_dt_needed_order_1.so
|
|
# |
|
|
# +-> libtest_relo_check_dt_needed_order_2.so
|
|
# -----------------------------------------------------------------------------
|
|
libtest_relo_check_dt_needed_order_shared_libraries := \
|
|
libtest_relo_check_dt_needed_order_1 libtest_relo_check_dt_needed_order_2
|
|
|
|
libtest_relo_check_dt_needed_order_src_files := dlopen_testlib_relo_check_dt_needed_order.cpp
|
|
libtest_relo_check_dt_needed_order_1_src_files := dlopen_testlib_relo_check_dt_needed_order_1.cpp
|
|
libtest_relo_check_dt_needed_order_2_src_files := dlopen_testlib_relo_check_dt_needed_order_2.cpp
|
|
|
|
module := libtest_relo_check_dt_needed_order
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
module := libtest_relo_check_dt_needed_order_1
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
module := libtest_relo_check_dt_needed_order_2
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library with dependency used by dlfcn tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_with_dependency_src_files := \
|
|
dlopen_testlib_simple.cpp
|
|
|
|
libtest_with_dependency_shared_libraries := libdlext_test
|
|
|
|
module := libtest_with_dependency
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by ifunc tests
|
|
# -----------------------------------------------------------------------------
|
|
libtest_ifunc_src_files := \
|
|
dlopen_testlib_ifunc.c
|
|
|
|
libtest_ifunc_clang_host := false
|
|
module := libtest_ifunc
|
|
build_target := SHARED_LIBRARY
|
|
|
|
build_type := host
|
|
include $(TEST_PATH)/Android.build.mk
|
|
|
|
ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),arm64 x86 x86_64))
|
|
ifeq ($(TARGET_ARCH),arm64)
|
|
libtest_ifunc_multilib := 64
|
|
# TODO: This is a workaround - remove it once gcc
|
|
# removes its Android ifunc checks
|
|
libtest_ifunc_cflags := -mglibc
|
|
endif
|
|
|
|
build_type := target
|
|
libtest_ifunc_clang_target := false
|
|
include $(TEST_PATH)/Android.build.mk
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library used by atexit tests
|
|
# -----------------------------------------------------------------------------
|
|
|
|
libtest_atexit_src_files := \
|
|
atexit_testlib.cpp
|
|
|
|
module := libtest_atexit
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# This library is used by dl_load test to check symbol preempting
|
|
# by main executable
|
|
# -----------------------------------------------------------------------------
|
|
libdl_preempt_test_1_src_files := dl_preempt_library_1.cpp
|
|
|
|
module := libdl_preempt_test_1
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# This library is used by dl_load test to check symbol preempting
|
|
# by libdl_preempt_test_1.so
|
|
# -----------------------------------------------------------------------------
|
|
libdl_preempt_test_2_src_files := dl_preempt_library_2.cpp
|
|
|
|
module := libdl_preempt_test_2
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library with DF_1_GLOBAL
|
|
# -----------------------------------------------------------------------------
|
|
libdl_test_df_1_global_src_files := dl_df_1_global.cpp
|
|
libdl_test_df_1_global_ldflags := -Wl,-z,global
|
|
|
|
# TODO (dimitry): host ld.gold does not yet support -z global
|
|
# remove this line once it is updated.
|
|
libdl_test_df_1_global_ldflags_host := -fuse-ld=bfd
|
|
|
|
module := libdl_test_df_1_global
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library using symbol from libdl_test_df_1_global
|
|
# -----------------------------------------------------------------------------
|
|
libtest_dlsym_df_1_global_src_files := dl_df_1_use_global.cpp
|
|
module := libtest_dlsym_df_1_global
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library with weak function
|
|
# -----------------------------------------------------------------------------
|
|
libtest_dlsym_weak_func_src_files := \
|
|
dlsym_weak_function.cpp
|
|
|
|
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_symbol.cpp
|
|
|
|
libtest_dlsym_from_this_shared_libraries_target := libdl
|
|
libtest_dlsym_from_this_shared_libraries := libtest_dlsym_from_this_child
|
|
|
|
module := libtest_dlsym_from_this
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
libtest_dlsym_from_this_child_src_files := dlsym_from_this_functions.cpp
|
|
|
|
libtest_dlsym_from_this_child_shared_libraries := libtest_dlsym_from_this_grandchild
|
|
|
|
module := libtest_dlsym_from_this_child
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
libtest_dlsym_from_this_grandchild_src_files := dlsym_from_this_symbol2.cpp
|
|
|
|
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 := \
|
|
dlopen_weak_undefined.cpp
|
|
|
|
module := libtest_dlopen_weak_undefined_func
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library with constructor that calls dlopen() b/7941716
|
|
# -----------------------------------------------------------------------------
|
|
libtest_dlopen_from_ctor_src_files := \
|
|
dlopen_testlib_dlopen_from_ctor.cpp
|
|
|
|
module := libtest_dlopen_from_ctor
|
|
|
|
libtest_dlopen_from_ctor_shared_libraries_target := libdl
|
|
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Library that depends on the library with constructor that calls dlopen() b/7941716
|
|
# -----------------------------------------------------------------------------
|
|
|
|
libtest_dlopen_from_ctor_main_src_files := empty.cpp
|
|
libtest_dlopen_from_ctor_main_shared_libraries := libtest_dlopen_from_ctor
|
|
|
|
module := libtest_dlopen_from_ctor_main
|
|
include $(LOCAL_PATH)/Android.build.testlib.mk
|