am 5f32207a
: Wrap ARM abort() to improve stack trace.
Merge commit '5f32207a3db0bea3ca1c7f4b2b563c11b895f276' into eclair-mr2-plus-aosp * commit '5f32207a3db0bea3ca1c7f4b2b563c11b895f276': Wrap ARM abort() to improve stack trace.
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user