diff --git a/libc/Android.mk b/libc/Android.mk index 1425673f8..cea874fa1 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -540,18 +540,24 @@ ifneq ($(filter arm x86,$(TARGET_ARCH)),) # that will call __cxa_finalize(&__dso_handle) in order to ensure that # static C++ destructors are properly called on dlclose(). # + +libc_crt_target_so_cflags := $(libc_crt_target_cflags) +ifeq ($(TARGET_ARCH),x86) + # This flag must be added for x86 targets, but not for ARM + libc_crt_target_so_cflags += -fPIC +endif GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o $(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S @mkdir -p $(dir $@) - $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< + $(TARGET_CC) $(libc_crt_target_so_cflags) -o $@ -c $< ALL_GENERATED_SOURCES += $(GEN) GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o $(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend_so.S @mkdir -p $(dir $@) - $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< + $(TARGET_CC) $(libc_crt_target_so_cflags) -o $@ -c $< ALL_GENERATED_SOURCES += $(GEN) -endif # TARGET_ARCH == x86 +endif # TARGET_ARCH == x86 || TARGET_ARCH == arm GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_static.o diff --git a/libc/arch-x86/bionic/__stack_chk_fail_local.S b/libc/arch-x86/bionic/__stack_chk_fail_local.S new file mode 100644 index 000000000..59fe86ec3 --- /dev/null +++ b/libc/arch-x86/bionic/__stack_chk_fail_local.S @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * Contributed by: Intel Corporation + */ + + .text + .p2align 4,,15 + .globl __stack_chk_fail_local + .hidden __stack_chk_fail_local + .type __stack_chk_fail_local, @function + +__stack_chk_fail_local: +#ifdef __PIC__ + pushl %ebx + call __x86.get_pc_thunk.bx + addl $_GLOBAL_OFFSET_TABLE_, %ebx + call __stack_chk_fail@PLT +#else /* PIC */ + jmp __stack_chk_fail +#endif /* not PIC */ + + .size __stack_chk_fail_local, .-__stack_chk_fail_local diff --git a/libc/arch-x86/bionic/crtbegin_dynamic.S b/libc/arch-x86/bionic/crtbegin_dynamic.S index 279269bdb..540556b2c 100644 --- a/libc/arch-x86/bionic/crtbegin_dynamic.S +++ b/libc/arch-x86/bionic/crtbegin_dynamic.S @@ -131,4 +131,7 @@ frame_dummy: .comm object.4466,24,4 .weak __register_frame_info_bases .weak __deregister_frame_info_bases + #include "__dso_handle.S" +#include "__stack_chk_fail_local.S" + diff --git a/libc/arch-x86/bionic/crtbegin_so.S b/libc/arch-x86/bionic/crtbegin_so.S index a789ba07d..2741742fe 100644 --- a/libc/arch-x86/bionic/crtbegin_so.S +++ b/libc/arch-x86/bionic/crtbegin_so.S @@ -95,3 +95,4 @@ __x86.get_pc_thunk.bx: ret #include "__dso_handle.S" +#include "__stack_chk_fail_local.S" diff --git a/libc/arch-x86/bionic/crtbegin_static.S b/libc/arch-x86/bionic/crtbegin_static.S index 6006d8f80..a8d62d624 100644 --- a/libc/arch-x86/bionic/crtbegin_static.S +++ b/libc/arch-x86/bionic/crtbegin_static.S @@ -130,4 +130,6 @@ frame_dummy: .comm object.4466,24,4 .weak __register_frame_info_bases .weak __deregister_frame_info_bases + #include "__dso_handle.S" +#include "__stack_chk_fail_local.S" diff --git a/linker/Android.mk b/linker/Android.mk index 27a667736..52f7ce3b1 100644 --- a/linker/Android.mk +++ b/linker/Android.mk @@ -49,6 +49,7 @@ LOCAL_CFLAGS += -DANDROID_ARM_LINKER else ifeq ($(TARGET_ARCH),x86) LOCAL_CFLAGS += -DANDROID_X86_LINKER + LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/arch-x86/bionic else ifeq ($(TARGET_ARCH),sh) LOCAL_CFLAGS += -DANDROID_SH_LINKER diff --git a/linker/arch/x86/begin.S b/linker/arch/x86/begin.S index b4427e0cb..5be59cb15 100644 --- a/linker/arch/x86/begin.S +++ b/linker/arch/x86/begin.S @@ -44,3 +44,5 @@ _start: popl %esp jmp *%eax + +#include "__stack_chk_fail_local.S"