+2015-03-13 H.J. Lu <hjl.tools@gmail.com>
+
+ * backtrace.c (prepare_thread): Use PTRACE_GETREGS/PTRACE_SETREGS
+ instead of PTRACE_POKEUSER.
+ (exec_dump): Check EM_X86_64 instead of ELFCLASS64 for
+ is_x86_64_native.
+
2015-02-18 Mark Wielaard <mjw@redhat.com>
* newdata.c (check_section_data): Use PRId64 for printing loff_t.
abort ();
#else /* x86_64 */
long l;
+ struct user_regs_struct user_regs;
errno = 0;
- l = ptrace (PTRACE_POKEUSER, pid2,
- (void *) (intptr_t) offsetof (struct user_regs_struct, rip), jmp);
+ l = ptrace (PTRACE_GETREGS, pid2, 0, (intptr_t) &user_regs);
+ assert_perror (errno);
+ assert (l == 0);
+ user_regs.rip = (intptr_t) jmp;
+ l = ptrace (PTRACE_SETREGS, pid2, 0, (intptr_t) &user_regs);
assert_perror (errno);
assert (l == 0);
l = ptrace (PTRACE_CONT, pid2, NULL, (void *) (intptr_t) SIGUSR2);
#ifndef __x86_64__
is_x86_64_native = false;
#else /* __x86_64__ */
- is_x86_64_native = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
+ is_x86_64_native = ehdr->e_machine == EM_X86_64;
#endif /* __x86_64__ */
void (*jmp) (void) = 0;
if (is_x86_64_native)