Add directives to force stop unwinding.
On aarch64/x86/x86_64 add a macro that inserts a cfi directive that will stop unwinding. For arm, clang doesn't allow emitting .cantunwind, so add a comment and leave it the same as it current is. Add this macro to __libc_init and __start_thread. Also, remove duplicate compilation of libc_init_static.cpp that already includes the static library that includes that file. Bug: 15469122 Test: Did unwinds using new unwinder tool (unwind) and debuggerd -b Test: and verified new unwinder works on aarch64/x86/x86_64. Test: Verified that it works on old unwinder for aarch64/x86, but Test: x86_64 doesn't work properly, but as well as before. Change-Id: I77302e8f6c7ba1549d98a4a164106ee82c9ecadc
This commit is contained in:
parent
7c6784061d
commit
93ea09f65c
|
@ -1826,7 +1826,6 @@ cc_library {
|
|||
"bionic/dl_iterate_phdr_static.cpp",
|
||||
"bionic/icu_static.cpp",
|
||||
"bionic/malloc_common.cpp",
|
||||
"bionic/libc_init_static.cpp",
|
||||
],
|
||||
cflags: ["-DLIBC_STATIC"],
|
||||
whole_static_libs: ["libc_init_static"],
|
||||
|
|
|
@ -34,11 +34,15 @@
|
|||
|
||||
#include "pthread_internal.h"
|
||||
|
||||
#include "private/bionic_macros.h"
|
||||
|
||||
extern "C" pid_t __bionic_clone(uint32_t flags, void* child_stack, int* parent_tid, void* tls, int* child_tid, int (*fn)(void*), void* arg);
|
||||
extern "C" __noreturn void __exit(int status);
|
||||
|
||||
// Called from the __bionic_clone assembler to call the thread function then exit.
|
||||
extern "C" __LIBC_HIDDEN__ void __start_thread(int (*fn)(void*), void* arg) {
|
||||
BIONIC_STOP_UNWIND;
|
||||
|
||||
pthread_internal_t* self = __get_thread();
|
||||
if (self && self->tid == -1) {
|
||||
self->tid = syscall(__NR_gettid);
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include "libc_init_common.h"
|
||||
|
||||
#include "private/bionic_globals.h"
|
||||
#include "private/bionic_macros.h"
|
||||
#include "private/bionic_ssp.h"
|
||||
#include "private/bionic_tls.h"
|
||||
#include "private/KernelArgumentBlock.h"
|
||||
|
@ -108,6 +109,7 @@ __noreturn void __libc_init(void* raw_args,
|
|||
void (*onexit)(void) __unused,
|
||||
int (*slingshot)(int, char**, char**),
|
||||
structors_array_t const * const structors) {
|
||||
BIONIC_STOP_UNWIND;
|
||||
|
||||
KernelArgumentBlock args(raw_args);
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "pthread_internal.h"
|
||||
|
||||
#include "private/bionic_globals.h"
|
||||
#include "private/bionic_macros.h"
|
||||
#include "private/bionic_page.h"
|
||||
#include "private/bionic_tls.h"
|
||||
#include "private/KernelArgumentBlock.h"
|
||||
|
@ -82,6 +83,8 @@ __noreturn void __libc_init(void* raw_args,
|
|||
void (*onexit)(void) __unused,
|
||||
int (*slingshot)(int, char**, char**),
|
||||
structors_array_t const * const structors) {
|
||||
BIONIC_STOP_UNWIND;
|
||||
|
||||
KernelArgumentBlock args(raw_args);
|
||||
__libc_init_main_thread(args);
|
||||
|
||||
|
|
|
@ -66,4 +66,17 @@ static inline T* align_up(T* p, size_t align) {
|
|||
return reinterpret_cast<T*>(align_up(reinterpret_cast<uintptr_t>(p), align));
|
||||
}
|
||||
|
||||
#if defined(__arm__)
|
||||
// Do not emit anything for arm, clang does not allow emiting an arm unwind
|
||||
// directive.
|
||||
// #define BIONIC_STOP_UNWIND asm volatile(".cantunwind")
|
||||
#define BIONIC_STOP_UNWIND
|
||||
#elif defined(__aarch64__)
|
||||
#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined x30")
|
||||
#elif defined(__i386__)
|
||||
#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%eip")
|
||||
#elif defined(__x86_64__)
|
||||
#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%rip")
|
||||
#endif
|
||||
|
||||
#endif // _BIONIC_MACROS_H_
|
||||
|
|
Loading…
Reference in New Issue