Fix libcorkscrew for x86 targets (bionic) as well as the host (glibc).

Longer term, we might want to offer <ucontext.h> and have that be like glibc's,
but not today. (Note that POSIX says nothing about mcontext_t and glibc,
Mac OS, and the Linux kernel headers are all mutually incompatible.)

Change-Id: Ia074b51f4567cd54e06bbe29721389c8d1278614
This commit is contained in:
Elliott Hughes 2012-05-21 13:59:52 -07:00
parent 04607b8aa9
commit 6b3bab39d1

View file

@ -33,9 +33,21 @@
#include <sys/ptrace.h>
#include <cutils/log.h>
#if defined(__BIONIC__)
// Bionic offers the Linux kernel headers.
#include <asm/sigcontext.h>
#include <asm/ucontext.h>
typedef struct ucontext ucontext_t;
#else
// glibc has its own renaming of the Linux kernel's structures.
#define __USE_GNU // For REG_EBP, REG_ESP, and REG_EIP.
#include <ucontext.h>
#endif
/* Unwind state. */
typedef struct {
uint32_t ebp;
@ -84,9 +96,15 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo, void* sigcontext,
const ucontext_t* uc = (const ucontext_t*)sigcontext;
unwind_state_t state;
#if defined(__BIONIC__)
state.ebp = uc->uc_mcontext.ebp;
state.esp = uc->uc_mcontext.esp;
state.eip = uc->uc_mcontext.eip;
#else
state.ebp = uc->uc_mcontext.gregs[REG_EBP];
state.esp = uc->uc_mcontext.gregs[REG_ESP];
state.eip = uc->uc_mcontext.gregs[REG_EIP];
#endif
memory_t memory;
init_memory(&memory, map_info_list);