From 3343ef86879b9348bb038bc7adecb665236ca4d8 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Fri, 30 May 2014 16:08:10 +0800 Subject: [PATCH] Skip 'bx reg' on arm-linux In arm-tdep.c, arm_skip_stub is installed to gdbarch skip_trampoline_code, but in arm-linux-tdep.c, find_solib_trampoline_target is installed to skip_trampoline_code. That means gdb configured for arm-linux target doesn't recognize some arm specific trampolines or stubs. Beside handling generic solib trampoline, gdb for arm-linux target should be able to handle arm specific trampolines. This patch is to skip arm specific stubs, if any, and as a fallback, skip the generic solib trampoline. gdb: 2014-06-24 Yao Qi * arm-linux-tdep.c (arm_linux_skip_trampoline_code): New. (arm_linux_init_abi): Set skip_trampoline_code with gdbarch_skip_trampoline_code instead of find_solib_trampoline_target. --- gdb/ChangeLog | 7 +++++++ gdb/arm-linux-tdep.c | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 19a66576af1..44e85753417 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2014-06-24 Yao Qi + + * arm-linux-tdep.c (arm_linux_skip_trampoline_code): New. + (arm_linux_init_abi): Set skip_trampoline_code with + gdbarch_skip_trampoline_code instead of + find_solib_trampoline_target. + 2014-06-24 Yao Qi * arm-tdep.c (arm_stub_unwind_sniffer): Return 1 if diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index 65d9084e8f5..a96ea3fc94f 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -1322,6 +1322,19 @@ arm_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) return 0; } +/* Implement the skip_trampoline_code gdbarch method. */ + +static CORE_ADDR +arm_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) +{ + CORE_ADDR target_pc = arm_skip_stub (frame, pc); + + if (target_pc != 0) + return target_pc; + + return find_solib_trampoline_target (frame, pc); +} + static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) @@ -1387,7 +1400,7 @@ arm_linux_init_abi (struct gdbarch_info info, set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step); /* Shared library handling. */ - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_trampoline_code (gdbarch, arm_linux_skip_trampoline_code); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ -- 2.30.2