platform_bionic/libc/arch-arm/bionic
Elliott Hughes 4bf5522662 Abort harder.
Some PoS internal system can't cope with more than 4 stack frames,
so the fact that our abort(3) implementation takes 4 frames by itself
makes it useless.

Re-reading POSIX, it only says "behaves as if", so the previous
implementation chain wasn't mandatory and we can just go straight to
calling tgkill...

Before:

     #00 pc 0000000000069be4  /system/lib64/libc.so (tgkill+8)
     #01 pc 0000000000066d50  /system/lib64/libc.so (pthread_kill+64)
     #02 pc 0000000000028110  /system/lib64/libc.so (raise+24)
     #03 pc 000000000001d4ec  /system/lib64/libc.so (abort+52)

After:

     #00 pc 0000000000069bc8  /system/lib64/libc.so (tgkill+8)
     #01 pc 000000000001d4c8  /system/lib64/libc.so (abort+80)
     #02 pc 0000000000001494  /system/xbin/crasher64 (_ZL9do_actionPKc+872)
     #03 pc 00000000000010e0  /system/xbin/crasher64 (main+88)

This is less useful on 32-bit ARM because there there's an extra trampoline
from an assembler abort(3) implementation, so you'll still only get one
meaningful stack frame. But every other architecture will now get two!

But wait!

It turns out that the assembler hack isn't needed any more. Here we are
unwinding just fine all the way through the 32-bit ARM crasher:

Before (with direct call to tgkill but still using the assembler):

     #00 pc 00049e7c  /system/lib/libc.so (tgkill+12)
     #01 pc 00019c6f  /system/lib/libc.so (__libc_android_abort+50)
     #02 pc 000181f8  /system/lib/libc.so (abort+4)
     #03 pc 00001025  /system/xbin/crasher (_ZL9do_actionPKc+656)
     #04 pc 00017721  /system/lib/libc.so (__libc_init+48)
     #05 pc 00000b38  /system/xbin/crasher (_start+96)

After:

     #00 pc 00049e6c  /system/lib/libc.so (tgkill+12)
     #01 pc 00019c5f  /system/lib/libc.so (abort+50)
     #02 pc 00001025  /system/xbin/crasher (_ZL9do_actionPKc+656)
     #03 pc 00017721  /system/lib/libc.so (__libc_init+48)
     #04 pc 00000b38  /system/xbin/crasher (_start+96)

(As you can see, the fact that we see __libc_init rather than main was true
with the assembler stub too, so that's not a regression even if it does seem
odd...)

Bug: N/A
Test: ran crasher64
Change-Id: I9dd5b214c495604c8b502c7ec0de3631080d8c29
2016-11-29 22:02:25 -08:00
..
__aeabi.c Move __aeabi* symbols to LIBC_N version 2016-01-08 10:13:16 -08:00
__bionic_clone.S Use ENTRY_PRIVATE in __bionic_clone assembler. 2016-10-26 17:01:58 -07:00
__restore.S Add a no dwarf version of assembler macros. 2015-09-30 15:32:15 -07:00
_exit_with_stack_teardown.S Hide _exit_with_stack_teardown. 2014-05-16 16:17:44 -07:00
atexit_legacy.c Regenerate the NOTICE files. 2014-01-07 13:46:11 -08:00
atomics_arm.c libc: Fix typo that broke NDK compatibility. 2011-11-23 14:38:36 +01:00
exidx_dynamic.c Move __aeabi* symbols to LIBC_N version 2016-01-08 10:13:16 -08:00
exidx_static.c Add link.h for all platforms with dl_phdr_info 2012-08-17 12:44:23 -07:00
libgcc_compat.c [MIPS] Add __popcountsi2 to libgcc_compat.c 2016-02-25 14:28:45 -08:00
popcount_tab.c Add exported __popcount_tab for libgcc compat under compiler-rt. 2015-08-24 13:06:10 -07:00
setjmp.S Minor copyright header unification. 2016-10-24 12:57:55 -07:00
syscall.S Ensure __set_errno is still visible on LP32. 2014-09-08 16:46:50 -07:00
vfork.S Invalidate cached pid in vfork. 2015-08-07 19:44:12 -07:00