From d6bf3d5e19f192dc1949b573d931d487c42730fa Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Wed, 1 Apr 2015 16:26:54 -0700 Subject: [PATCH] Don't export new/delete from libc shared libraries. This used to be handled by -fvisibility=hidden on libc_cxa, but that was broken by the resolution of https://llvm.org/PR22419 (introduced to Android in today's clang update). Now we just use a version script that prevents these from being re-exported from our shared libraries. Change-Id: Ib290e1d0d7426e09ad17a91178162fff6dbdcfa9 --- libc/Android.mk | 27 +++++++++++++++++++++------ libc/version_script.txt | 12 ++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 libc/version_script.txt diff --git a/libc/Android.mk b/libc/Android.mk index e438552eb..0de0fb21c 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -1347,9 +1347,6 @@ LOCAL_CFLAGS := $(libc_common_cflags) LOCAL_CONLYFLAGS := $(libc_common_conlyflags) LOCAL_CPPFLAGS := $(libc_common_cppflags) -# TODO: This is to work around b/19059885. Remove after root cause is fixed -LOCAL_LDFLAGS_arm := -Wl,--hash-style=sysv - LOCAL_C_INCLUDES := $(libc_common_c_includes) LOCAL_SRC_FILES := \ $(libc_arch_dynamic_src_files) \ @@ -1359,8 +1356,10 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE := libc LOCAL_CLANG := $(use_clang) -LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies) LOCAL_REQUIRED_MODULES := tzdata +LOCAL_ADDITIONAL_DEPENDENCIES := \ + $(libc_common_additional_dependencies) \ + $(LOCAL_PATH)/version_script.txt \ # Leave the symbols in the shared library so that stack unwinders can produce # meaningful name resolution. @@ -1379,11 +1378,17 @@ LOCAL_WHOLE_STATIC_LIBRARIES := libc_common LOCAL_CXX_STL := none LOCAL_SYSTEM_SHARED_LIBRARIES := +# Don't re-export new/delete and friends, even if the compiler really wants to. +LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/version_script.txt + # We'd really like to do this for all architectures, but since this wasn't done # before, these symbols must continue to be exported on LP32 for binary # compatibility. LOCAL_LDFLAGS_64 := -Wl,--exclude-libs,libgcc.a +# TODO: This is to work around b/19059885. Remove after root cause is fixed +LOCAL_LDFLAGS_arm := -Wl,--hash-style=sysv + $(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags)) $(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_arch_dynamic_src_files)) # special for arm @@ -1431,7 +1436,9 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE := libc_malloc_debug_leak LOCAL_CLANG := $(use_clang) -LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies) +LOCAL_ADDITIONAL_DEPENDENCIES := \ + $(libc_common_additional_dependencies) \ + $(LOCAL_PATH)/version_script.txt \ LOCAL_SHARED_LIBRARIES := libc libdl LOCAL_CXX_STL := none @@ -1442,6 +1449,9 @@ LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm LOCAL_STATIC_LIBRARIES += libc++abi LOCAL_ALLOW_UNDEFINED_SYMBOLS := true +# Don't re-export new/delete and friends, even if the compiler really wants to. +LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/version_script.txt + # Don't install on release build LOCAL_MODULE_TAGS := eng debug LOCAL_ADDRESS_SANITIZER := false @@ -1471,12 +1481,17 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE := libc_malloc_debug_qemu LOCAL_CLANG := $(use_clang) -LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies) +LOCAL_ADDITIONAL_DEPENDENCIES := \ + $(libc_common_additional_dependencies) \ + $(LOCAL_PATH)/version_script.txt \ LOCAL_SHARED_LIBRARIES := libc libdl LOCAL_CXX_STL := none LOCAL_SYSTEM_SHARED_LIBRARIES := +# Don't re-export new/delete and friends, even if the compiler really wants to. +LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/version_script.txt + # Don't install on release build LOCAL_MODULE_TAGS := eng debug LOCAL_ADDRESS_SANITIZER := false diff --git a/libc/version_script.txt b/libc/version_script.txt new file mode 100644 index 000000000..afc5e5c47 --- /dev/null +++ b/libc/version_script.txt @@ -0,0 +1,12 @@ +LIBC { + local: + _ZSt7nothrow; + _ZdaPv; + _ZdaPvRKSt9nothrow_t; + _ZdlPv; + _ZdlPvRKSt9nothrow_t; + _Znaj; + _ZnajRKSt9nothrow_t; + _Znwj; + _ZnwjRKSt9nothrow_t; +};