From 96dd2b6e85e03ca9ab2600c2031490c22d5626ad Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 4 Apr 2015 00:42:28 -0400 Subject: [PATCH] fix incompatibility with -fstack-protector-strong The __libc_init_tls function in libc_init_common.cpp takes a reference to a local variable so it ends up being protected. Since this happens before TLS and the stack guard value are initialized, it breaks. The libc_init_common code needs to be compiled with -fno-stack-protector and can then be merged into libc_bionic. Change-Id: Ie95ea2ff533d4af1cfad1c9bc59e49f20a8e119d --- libc/Android.mk | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libc/Android.mk b/libc/Android.mk index de0bb4174..d5252de14 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -147,7 +147,6 @@ libc_bionic_ndk_src_files := \ bionic/lfs64_support.cpp \ bionic/__libc_current_sigrtmax.cpp \ bionic/__libc_current_sigrtmin.cpp \ - bionic/libc_init_common.cpp \ bionic/libc_logging.cpp \ bionic/libgen.cpp \ bionic/link.cpp \ @@ -672,6 +671,30 @@ $(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags)) include $(BUILD_STATIC_LIBRARY) +# ======================================================== +# libc_init_common.a - common static/dynamic init code +# ======================================================== +# +# The initialization code needs to be compiled with -fno-stack-protector since +# it runs before TLS and initial guard value are set up. It takes the address +# of a stack variable, triggering protection with -fstack-protector-strong. + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := bionic/libc_init_common.cpp +LOCAL_CFLAGS := $(libc_common_cflags) -fno-stack-protector +LOCAL_CONLYFLAGS := $(libc_common_conlyflags) +LOCAL_CPPFLAGS := $(libc_common_cppflags) +LOCAL_C_INCLUDES := $(libc_common_c_includes) +LOCAL_MODULE := libc_init_common +LOCAL_CLANG := $(use_clang) +LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies) +LOCAL_SYSTEM_SHARED_LIBRARIES := + +$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags)) +include $(BUILD_STATIC_LIBRARY) + + # ======================================================== # libc_tzcode.a - upstream 'tzcode' code # ======================================================== @@ -962,6 +985,7 @@ LOCAL_CLANG := $(use_clang) LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies) LOCAL_CXX_STL := none LOCAL_SYSTEM_SHARED_LIBRARIES := +LOCAL_WHOLE_STATIC_LIBRARIES := libc_init_common LOCAL_SANITIZE := never LOCAL_NATIVE_COVERAGE := $(bionic_coverage)