From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org
Subject: [PATCH v2] Implement the skip_solib_resolver gdbarch hook for FreeBSD architectures.
Date: Fri, 17 Jul 2020 15:59:41 -0700 [thread overview]
Message-ID: <20200717225941.82442-1-jhb@FreeBSD.org> (raw)
In-Reply-To: <4ae8ff57-66bd-0e26-5bdf-46aabf4699a3@FreeBSD.org>
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.
---
gdb/ChangeLog | 9 +++++++++
gdb/fbsd-tdep.c | 14 ++++++++++++++
gdb/fbsd-tdep.h | 5 +++++
gdb/mips-fbsd-tdep.c | 16 ++++++++++++++++
4 files changed, 44 insertions(+)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1b5bc8b458..ceff8178d7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2020-07-17 John Baldwin <jhb@FreeBSD.org>
+
+ * 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.
+
2020-07-17 Tom Tromey <tromey@adacore.com>
* linux-nat.c (linux_nat_target::supports_non_stop)
diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c
index 557c5d3d73..ca397fa8e0 100644
--- a/gdb/fbsd-tdep.c
+++ b/gdb/fbsd-tdep.c
@@ -21,6 +21,7 @@
#include "auxv.h"
#include "gdbcore.h"
#include "inferior.h"
+#include "objfiles.h"
#include "regcache.h"
#include "regset.h"
#include "gdbthread.h"
@@ -2071,6 +2072,18 @@ fbsd_get_thread_local_address (struct gdbarch *gdbarch, CORE_ADDR dtv_addr,
return addr + offset;
}
+/* See fbsd-tdep.h. */
+
+CORE_ADDR
+fbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+ struct bound_minimal_symbol msym = lookup_bound_minimal_symbol ("_rtld_bind");
+ if (msym.minsym != nullptr && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
+ return frame_unwind_caller_pc (get_current_frame ());
+
+ return 0;
+}
+
/* To be called from GDB_OSABI_FREEBSD handlers. */
void
@@ -2085,6 +2098,7 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
set_gdbarch_gdb_signal_from_target (gdbarch, fbsd_gdb_signal_from_target);
set_gdbarch_gdb_signal_to_target (gdbarch, fbsd_gdb_signal_to_target);
+ set_gdbarch_skip_solib_resolver (gdbarch, fbsd_skip_solib_resolver);
/* `catch syscall' */
set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml");
diff --git a/gdb/fbsd-tdep.h b/gdb/fbsd-tdep.h
index 5dd8203299..e8e49dc25f 100644
--- a/gdb/fbsd-tdep.h
+++ b/gdb/fbsd-tdep.h
@@ -71,4 +71,9 @@ extern CORE_ADDR fbsd_get_thread_local_address (struct gdbarch *gdbarch,
CORE_ADDR lm_addr,
CORE_ADDR offset);
+/* Implement the "skip_solib_resolver" gdbarch method. */
+
+extern CORE_ADDR fbsd_skip_solib_resolver (struct gdbarch *gdbarch,
+ CORE_ADDR pc);
+
#endif /* fbsd-tdep.h */
diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c
index abaf7f2474..ba666f1dc5 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 ?
--
2.25.1
next prev parent reply other threads:[~2020-07-17 23:07 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-11 16:14 [PATCH] " John Baldwin
2020-07-11 18:54 ` Simon Marchi
2020-07-17 18:50 ` John Baldwin
2020-07-17 22:59 ` John Baldwin [this message]
2020-07-19 15:47 ` [PATCH v2] " Simon Marchi
2020-07-11 19:17 ` [PATCH] " Tom Tromey
2020-07-11 21:18 ` Simon Marchi
2020-07-11 21:56 ` Tom Tromey
2020-07-17 18:15 ` John Baldwin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200717225941.82442-1-jhb@FreeBSD.org \
--to=jhb@freebsd.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox