diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-01-25 03:42:36 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-01-25 03:42:36 +0000 |
commit | cb405b2987880c58c13e5988e39b3e50d3cb1ebf (patch) | |
tree | dbb2d3837b937f05a4f9ef18d10dc995d276a375 | |
parent | 73871ad09be8a8259171d606c4e3e3cf08d4733c (diff) | |
parent | 586b6761d0c27f3002066e593099a624a32b9eaf (diff) | |
download | bionic-cb405b2987880c58c13e5988e39b3e50d3cb1ebf.tar.gz |
Merge changes from topic "update-ndk-crt-objects"android-wear-8.0.0_r1
* changes:
Partial revert of "Remove obsolete __stack_chk_fail_local."
Pre-M and GCC compatibility for crtbegin.
-rw-r--r-- | libc/arch-common/bionic/crtbegin.c | 5 | ||||
-rw-r--r-- | libc/arch-common/bionic/crtbegin_so.c | 3 | ||||
-rw-r--r-- | libc/arch-common/bionic/pthread_atfork.h | 7 | ||||
-rw-r--r-- | libc/arch-x86/bionic/__stack_chk_fail_local.h | 57 |
4 files changed, 71 insertions, 1 deletions
diff --git a/libc/arch-common/bionic/crtbegin.c b/libc/arch-common/bionic/crtbegin.c index 45c9ea707..31ad62184 100644 --- a/libc/arch-common/bionic/crtbegin.c +++ b/libc/arch-common/bionic/crtbegin.c @@ -36,7 +36,7 @@ SECTION(".init_array") void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1; SECTION(".fini_array") void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1; #undef SECTION -static void _start_main(void* raw_args) __used { +__used static void _start_main(void* raw_args) { structors_array_t array; array.preinit_array = &__PREINIT_ARRAY__; array.init_array = &__INIT_ARRAY__; @@ -66,3 +66,6 @@ __asm__(PRE "movq %rsp,%rdi; andq $~0xf,%rsp; callq _start_main" POST); #include "__dso_handle.h" #include "atexit.h" #include "pthread_atfork.h" +#ifdef __i386__ +# include "../../arch-x86/bionic/__stack_chk_fail_local.h" +#endif diff --git a/libc/arch-common/bionic/crtbegin_so.c b/libc/arch-common/bionic/crtbegin_so.c index 258a6cd71..3754363ab 100644 --- a/libc/arch-common/bionic/crtbegin_so.c +++ b/libc/arch-common/bionic/crtbegin_so.c @@ -57,3 +57,6 @@ void __on_dlclose() { # include "atexit.h" #endif #include "pthread_atfork.h" +#ifdef __i386__ +# include "../../arch-x86/bionic/__stack_chk_fail_local.h" +#endif diff --git a/libc/arch-common/bionic/pthread_atfork.h b/libc/arch-common/bionic/pthread_atfork.h index 0c48a1269..c6a33ffe0 100644 --- a/libc/arch-common/bionic/pthread_atfork.h +++ b/libc/arch-common/bionic/pthread_atfork.h @@ -14,6 +14,12 @@ * limitations under the License. */ +#include <android/api-level.h> + +// __register_atfork wasn't available until android-23. We need to build a +// pre-23 and 23+ version of crtbegin. +#if __ANDROID_API__ >= __ANDROID_API_M__ + extern void* __dso_handle; extern int __register_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void), void* dso); @@ -27,3 +33,4 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo return __register_atfork(prepare, parent, child, &__dso_handle); } +#endif /* __ANDROID_API__ >= __ANDROID_API_M__ */ diff --git a/libc/arch-x86/bionic/__stack_chk_fail_local.h b/libc/arch-x86/bionic/__stack_chk_fail_local.h new file mode 100644 index 000000000..0b0fd7f8b --- /dev/null +++ b/libc/arch-x86/bionic/__stack_chk_fail_local.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 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. + */ + +#include <sys/cdefs.h> + +/* + __stack_chk_fail routine is runtime part of stack protector compiler + feature. It's implemented in libc and represents die routine when stack + corruption is detected. + + Calls are generated by compiler and injected into user functions when + -fstack-protector* options are used. + + __stack_chk_fail_local is wrapper for __stack_chk_fail. Compiler generates + wrapper calls instead for PIC code only and only on IA32 for optimization + purpose (see gcc/config/i386/i386.c). Wrapper body is always included into + executable or library. This is the idea of optimization. + + Glibc is doing this via libc_nonshared.a which is linked automatically + everytime with libc.so. In bionic we have to bring it within crtfiles + because libc.so is real library and not a link script like libc.so at glibc. + + For x86_64 or non-PIC code compiler always generates __stack_chk_fail calls. +*/ + +#ifdef __i386__ +extern void __stack_chk_fail(); + +__LIBC_HIDDEN__ void __stack_chk_fail_local() { + __stack_chk_fail(); +} +#endif |