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
This commit is contained in:
Daniel Micay 2015-04-04 00:42:28 -04:00
parent cd588f847f
commit 96dd2b6e85

View File

@ -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)