aboutsummaryrefslogtreecommitdiff
path: root/gdb/mips-fbsd-tdep.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2020-07-20 09:09:58 -0700
committerJohn Baldwin <jhb@FreeBSD.org>2020-07-20 09:10:18 -0700
commited810cc7d3252bd8bfdb4303ee6b44293fe6214e (patch)
tree93cc390389149769497f84234c5ef0be3b4f092f /gdb/mips-fbsd-tdep.c
parentae5369e773c341ab55a130fffb4678bb3595d692 (diff)
downloadbinutils-ed810cc7d3252bd8bfdb4303ee6b44293fe6214e.zip
binutils-ed810cc7d3252bd8bfdb4303ee6b44293fe6214e.tar.gz
binutils-ed810cc7d3252bd8bfdb4303ee6b44293fe6214e.tar.bz2
Implement the skip_solib_resolver gdbarch hook for FreeBSD architectures.
The ELF runtime linker on all FreeBSD architectures uses the "_rtld_bind" entry point for unresolved PTL entries. FreeBSD/mips has an additional entry point called "_mips_rtld_bind". gdb/ChangeLog: * fbsd-tdep.c (fbsd_skip_solib_resolver): New function. (fbsd_init_abi): Install gdbarch "skip_solib_resolver" method. * fbsd-tdep.h (fbsd_skip_solib_resolver): New prototype. * mips-fbsd-tdep.c (mips_fbsd_skip_solib_resolver): New function. (mips_fbsd_init_abi): Install gdbarch "skip_solib_resolver" method.
Diffstat (limited to 'gdb/mips-fbsd-tdep.c')
-rw-r--r--gdb/mips-fbsd-tdep.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c
index abaf7f2..ba666f1 100644
--- a/gdb/mips-fbsd-tdep.c
+++ b/gdb/mips-fbsd-tdep.c
@@ -462,6 +462,20 @@ static const struct tramp_frame mips64_fbsd_sigframe =
/* Shared library support. */
+/* FreeBSD/mips can use an alternate routine in the runtime linker to
+ resolve functions. */
+
+static CORE_ADDR
+mips_fbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+ struct bound_minimal_symbol msym
+ = lookup_bound_minimal_symbol ("_mips_rtld_bind");
+ if (msym.minsym != nullptr && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
+ return frame_unwind_caller_pc (get_current_frame ());
+
+ return fbsd_skip_solib_resolver (gdbarch, pc);
+}
+
/* FreeBSD/mips uses a slightly different `struct link_map' than the
other FreeBSD platforms as it includes an additional `l_off'
member. */
@@ -546,6 +560,8 @@ mips_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_iterate_over_regset_sections
(gdbarch, mips_fbsd_iterate_over_regset_sections);
+ set_gdbarch_skip_solib_resolver (gdbarch, mips_fbsd_skip_solib_resolver);
+
/* FreeBSD/mips has SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, (gdbarch_ptr_bit (gdbarch) == 32 ?