forked from Imagelibrary/binutils-gdb
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.
This commit is contained in:
@@ -1,3 +1,12 @@
|
||||
2020-07-20 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-20 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* guile/scm-math.c (vlscm_integer_fits_p): Use 'uintmax_t'
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ?
|
||||
|
||||
Reference in New Issue
Block a user