aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-01-25 03:42:36 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-01-25 03:42:36 +0000
commitcb405b2987880c58c13e5988e39b3e50d3cb1ebf (patch)
treedbb2d3837b937f05a4f9ef18d10dc995d276a375
parent73871ad09be8a8259171d606c4e3e3cf08d4733c (diff)
parent586b6761d0c27f3002066e593099a624a32b9eaf (diff)
downloadbionic-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.c5
-rw-r--r--libc/arch-common/bionic/crtbegin_so.c3
-rw-r--r--libc/arch-common/bionic/pthread_atfork.h7
-rw-r--r--libc/arch-x86/bionic/__stack_chk_fail_local.h57
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