am b63e4e88: am 5f32207a: Wrap ARM abort() to improve stack trace.
Merge commit 'b63e4e88b0d13afa431864190b3515a549c16d85' * commit 'b63e4e88b0d13afa431864190b3515a549c16d85': Wrap ARM abort() to improve stack trace.
This commit is contained in:
commit
9c46315800
@ -39,8 +39,13 @@
|
||||
#define debug_log(format, ...) \
|
||||
__libc_android_log_print(ANDROID_LOG_DEBUG, "libc-abort", (format), ##__VA_ARGS__ )
|
||||
|
||||
#ifdef __arm__
|
||||
void
|
||||
__libc_android_abort(void)
|
||||
#else
|
||||
void
|
||||
abort(void)
|
||||
#endif
|
||||
{
|
||||
struct atexit *p = __atexit;
|
||||
static int cleanup_called = 0;
|
||||
@ -97,3 +102,29 @@ abort(void)
|
||||
(void)kill(getpid(), SIGABRT);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
#ifdef __arm__
|
||||
/*
|
||||
* abort() does not return, which gcc interprets to mean that it doesn't
|
||||
* need to preserve any of the callee-save registers. Unfortunately this
|
||||
* includes the link register, so if LR is used there is no way to determine
|
||||
* which function called abort().
|
||||
*
|
||||
* We work around this by inserting a trivial stub that doesn't alter
|
||||
* any of the "interesting" registers and thus doesn't need to save them.
|
||||
* We can't just call __libc_android_abort from C because gcc uses "bl"
|
||||
* without first saving LR, so we use an asm statement. This also has
|
||||
* the side-effect of replacing abort() with __libc_android_abort() in
|
||||
* the stack trace.
|
||||
*
|
||||
* Ideally __libc_android_abort would be static, but I haven't figured out
|
||||
* how to tell gcc to call a static function from an asm statement.
|
||||
*/
|
||||
void
|
||||
abort(void)
|
||||
{
|
||||
asm ("b __libc_android_abort");
|
||||
_exit(1); /* suppress gcc noreturn warnings */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user