Module Name:    src
Committed By:   christos
Date:           Sat Jun  4 16:14:29 UTC 2016

Modified Files:
        src/external/gpl3/gdb.old/dist/gdb: armnbsd-tdep.c
        src/external/gpl3/gdb/dist/gdb: armnbsd-tdep.c

Log Message:
PR/50773: Rin Okuyama: Fix single stepping on dynamically linked binaries
by skipping dynamic linker calls (from OpenBSD)


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c
cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c
diff -u src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c:1.3 src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c:1.4
--- src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c:1.3	Tue Feb  2 15:57:32 2016
+++ src/external/gpl3/gdb.old/dist/gdb/armnbsd-tdep.c	Sat Jun  4 12:14:29 2016
@@ -19,6 +19,7 @@
 
 #include "defs.h"
 #include "osabi.h"
+#include "objfiles.h"
 
 #include "arm-tdep.h"
 #include "solib-svr4.h"
@@ -34,6 +35,19 @@ static const gdb_byte arm_nbsd_arm_be_br
 static const gdb_byte arm_nbsd_thumb_le_breakpoint[] = {0xfe, 0xde};
 static const gdb_byte arm_nbsd_thumb_be_breakpoint[] = {0xde, 0xfe};
 
+/* from obsd-tdep.c with symbol name adjusted to ours */
+static CORE_ADDR
+armnbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  struct bound_minimal_symbol msym;
+
+  msym = lookup_minimal_symbol("_rtld_bind", NULL, NULL);
+  if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
+    return frame_unwind_caller_pc (get_current_frame ());
+  else
+    return find_solib_trampoline_target (get_current_frame (), pc);
+}
+
 static void
 arm_netbsd_init_abi_common (struct gdbarch_info info,
 			    struct gdbarch *gdbarch)
@@ -93,6 +107,9 @@ arm_netbsd_elf_init_abi (struct gdbarch_
   /* NetBSD ELF uses SVR4-style shared libraries.  */
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
+
+  /* for single stepping */
+  set_gdbarch_skip_solib_resolver (gdbarch, armnbsd_skip_solib_resolver);
 }
 
 static enum gdb_osabi

Index: src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c
diff -u src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c:1.3 src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c:1.4
--- src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c:1.3	Sun Aug 16 05:58:29 2015
+++ src/external/gpl3/gdb/dist/gdb/armnbsd-tdep.c	Sat Jun  4 12:14:29 2016
@@ -19,6 +19,7 @@
 
 #include "defs.h"
 #include "osabi.h"
+#include "objfiles.h"
 
 #include "arm-tdep.h"
 #include "solib-svr4.h"
@@ -34,6 +35,19 @@ static const gdb_byte arm_nbsd_arm_be_br
 static const gdb_byte arm_nbsd_thumb_le_breakpoint[] = {0xfe, 0xde};
 static const gdb_byte arm_nbsd_thumb_be_breakpoint[] = {0xde, 0xfe};
 
+/* from obsd-tdep.c with symbol name adjusted to ours */
+static CORE_ADDR
+armnbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  struct bound_minimal_symbol msym;
+
+  msym = lookup_minimal_symbol("_rtld_bind", NULL, NULL);
+  if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
+    return frame_unwind_caller_pc (get_current_frame ());
+  else
+    return find_solib_trampoline_target (get_current_frame (), pc);
+}
+
 static void
 arm_netbsd_init_abi_common (struct gdbarch_info info,
 			    struct gdbarch *gdbarch)
@@ -93,6 +107,9 @@ arm_netbsd_elf_init_abi (struct gdbarch_
   /* NetBSD ELF uses SVR4-style shared libraries.  */
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
+
+  /* for single stepping; see PR/50773 */
+  set_gdbarch_skip_solib_resolver (gdbarch, armnbsd_skip_solib_resolver);
 }
 
 static enum gdb_osabi

Reply via email to