summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-03-12 12:14:43 -0700
committerMark Wielaard <mjw@redhat.com>2015-03-13 16:06:23 +0100
commitbe7ea70f3fc2be7a39dc210a70e92109b5d9ef5d (patch)
tree9bdd2807d52d96f943a664dc162e358bad56eeb6
parentcbf25bb674320ad595707d2592799381979d85f3 (diff)
downloadelfutils-be7ea70f3fc2be7a39dc210a70e92109b5d9ef5d.tar.gz
tests: Use PTRACE_GETREGS/PTRACE_SETREGS to update rip
Use PTRACE_POKEUSER to update rip is unsupported for x32. We should use PTRACE_GETREGS/PTRACE_SETREGS to update rip. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r--tests/ChangeLog7
-rw-r--r--tests/backtrace.c10
2 files changed, 14 insertions, 3 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 6ae5e532..0162b85e 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+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.
diff --git a/tests/backtrace.c b/tests/backtrace.c
index e109654f..8b19b947 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -260,9 +260,13 @@ prepare_thread (pid_t pid2 __attribute__ ((unused)),
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);
@@ -375,7 +379,7 @@ exec_dump (const char *exec)
#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)