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, ...) \
|
#define debug_log(format, ...) \
|
||||||
__libc_android_log_print(ANDROID_LOG_DEBUG, "libc-abort", (format), ##__VA_ARGS__ )
|
__libc_android_log_print(ANDROID_LOG_DEBUG, "libc-abort", (format), ##__VA_ARGS__ )
|
||||||
|
|
||||||
|
#ifdef __arm__
|
||||||
|
void
|
||||||
|
__libc_android_abort(void)
|
||||||
|
#else
|
||||||
void
|
void
|
||||||
abort(void)
|
abort(void)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
struct atexit *p = __atexit;
|
struct atexit *p = __atexit;
|
||||||
static int cleanup_called = 0;
|
static int cleanup_called = 0;
|
||||||
@ -97,3 +102,29 @@ abort(void)
|
|||||||
(void)kill(getpid(), SIGABRT);
|
(void)kill(getpid(), SIGABRT);
|
||||||
_exit(1);
|
_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