mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-11 13:02:10 +08:00
gdb: Don't assume r_ldsomap when r_version > 1 on Linux
The r_ldsomap field is specific to Solaris (part of librtld_db), and should never be accessed for Linux. glibc is planning to add a field to support multiple namespaces. But there will be no r_ldsomap when r_version is bumped to 2. Add linux_[ilp32|lp64]_fetch_link_map_offsets to set r_ldsomap_offset to -1 and use them for Linux targets. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28236
This commit is contained in:
parent
4eb629d50d
commit
c0154a4a21
@ -1795,7 +1795,7 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
linux_init_abi (info, gdbarch, 1);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_lp64_fetch_link_map_offsets);
|
||||
linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -374,7 +374,7 @@ alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -2042,7 +2042,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Register DTrace handlers. */
|
||||
set_gdbarch_dtrace_parse_probe_argument (gdbarch, amd64_dtrace_parse_probe_argument);
|
||||
@ -2256,7 +2256,7 @@ amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
void _initialize_amd64_linux_tdep ();
|
||||
|
@ -732,7 +732,7 @@ arc_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries, with 32-bit ints, longs
|
||||
and pointers (ILP32). */
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
/* Suppress warning from -Wmissing-prototypes. */
|
||||
|
@ -1763,7 +1763,7 @@ arm_linux_init_abi (struct gdbarch_info info,
|
||||
tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE;
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Single stepping. */
|
||||
set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step);
|
||||
|
@ -43,7 +43,7 @@ cris_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
svr4_fetch_objfile_link_map);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
}
|
||||
|
||||
|
@ -239,7 +239,7 @@ csky_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -501,7 +501,7 @@ hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
tdep->in_solib_call_trampoline = hppa_in_solib_call_trampoline;
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, hppa_skip_trampoline_code);
|
||||
|
@ -1044,7 +1044,7 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* GNU/Linux uses the dynamic linker included in the GNU C Library. */
|
||||
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
|
||||
|
@ -237,7 +237,7 @@ ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "gdbsupport/gdb_optional.h"
|
||||
#include "gcore.h"
|
||||
#include "gcore-elf.h"
|
||||
#include "solib-svr4.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
@ -2724,3 +2725,62 @@ more information about this file, refer to the manpage of proc(5) and core(5).")
|
||||
NULL, show_dump_excluded_mappings,
|
||||
&setlist, &showlist);
|
||||
}
|
||||
|
||||
/* Fetch (and possibly build) an appropriate `link_map_offsets' for
|
||||
ILP32/LP64 Linux systems which don't have the r_ldsomap field. */
|
||||
|
||||
link_map_offsets *
|
||||
linux_ilp32_fetch_link_map_offsets ()
|
||||
{
|
||||
static link_map_offsets lmo;
|
||||
static link_map_offsets *lmp = nullptr;
|
||||
|
||||
if (lmp == nullptr)
|
||||
{
|
||||
lmp = &lmo;
|
||||
|
||||
lmo.r_version_offset = 0;
|
||||
lmo.r_version_size = 4;
|
||||
lmo.r_map_offset = 4;
|
||||
lmo.r_brk_offset = 8;
|
||||
lmo.r_ldsomap_offset = -1;
|
||||
|
||||
/* Everything we need is in the first 20 bytes. */
|
||||
lmo.link_map_size = 20;
|
||||
lmo.l_addr_offset = 0;
|
||||
lmo.l_name_offset = 4;
|
||||
lmo.l_ld_offset = 8;
|
||||
lmo.l_next_offset = 12;
|
||||
lmo.l_prev_offset = 16;
|
||||
}
|
||||
|
||||
return lmp;
|
||||
}
|
||||
|
||||
link_map_offsets *
|
||||
linux_lp64_fetch_link_map_offsets ()
|
||||
{
|
||||
static link_map_offsets lmo;
|
||||
static link_map_offsets *lmp = nullptr;
|
||||
|
||||
if (lmp == nullptr)
|
||||
{
|
||||
lmp = &lmo;
|
||||
|
||||
lmo.r_version_offset = 0;
|
||||
lmo.r_version_size = 4;
|
||||
lmo.r_map_offset = 8;
|
||||
lmo.r_brk_offset = 16;
|
||||
lmo.r_ldsomap_offset = -1;
|
||||
|
||||
/* Everything we need is in the first 40 bytes. */
|
||||
lmo.link_map_size = 40;
|
||||
lmo.l_addr_offset = 0;
|
||||
lmo.l_name_offset = 8;
|
||||
lmo.l_ld_offset = 16;
|
||||
lmo.l_next_offset = 24;
|
||||
lmo.l_prev_offset = 32;
|
||||
}
|
||||
|
||||
return lmp;
|
||||
}
|
||||
|
@ -98,4 +98,9 @@ extern CORE_ADDR linux_get_hwcap (struct target_ops *target);
|
||||
error, 0 is returned. */
|
||||
extern CORE_ADDR linux_get_hwcap2 (struct target_ops *target);
|
||||
|
||||
/* Fetch (and possibly build) an appropriate `struct link_map_offsets'
|
||||
for ILP32 and LP64 Linux systems. */
|
||||
extern struct link_map_offsets *linux_ilp32_fetch_link_map_offsets ();
|
||||
extern struct link_map_offsets *linux_lp64_fetch_link_map_offsets ();
|
||||
|
||||
#endif /* linux-tdep.h */
|
||||
|
@ -461,7 +461,7 @@ m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Core file support. */
|
||||
set_gdbarch_iterate_over_regset_sections
|
||||
|
@ -408,7 +408,7 @@ m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* GNU/Linux uses the dynamic linker included in the GNU C Library. */
|
||||
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
|
||||
|
@ -124,7 +124,7 @@ microblaze_linux_init_abi (struct gdbarch_info info,
|
||||
|
||||
/* Shared library handling. */
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Trampolines. */
|
||||
tramp_frame_prepend_unwinder (gdbarch,
|
||||
|
@ -1542,7 +1542,7 @@ mips_linux_init_abi (struct gdbarch_info info,
|
||||
set_gdbarch_get_longjmp_target (gdbarch,
|
||||
mips_linux_get_longjmp_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
tramp_frame_prepend_unwinder (gdbarch, µmips_linux_o32_sigframe);
|
||||
tramp_frame_prepend_unwinder (gdbarch,
|
||||
µmips_linux_o32_rt_sigframe);
|
||||
@ -1554,7 +1554,7 @@ mips_linux_init_abi (struct gdbarch_info info,
|
||||
set_gdbarch_get_longjmp_target (gdbarch,
|
||||
mips_linux_get_longjmp_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
set_gdbarch_long_double_bit (gdbarch, 128);
|
||||
/* These floatformats should probably be renamed. MIPS uses
|
||||
the same 128-bit IEEE floating point format that IA-64 uses,
|
||||
@ -1570,7 +1570,7 @@ mips_linux_init_abi (struct gdbarch_info info,
|
||||
set_gdbarch_get_longjmp_target (gdbarch,
|
||||
mips64_linux_get_longjmp_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
set_gdbarch_long_double_bit (gdbarch, 128);
|
||||
/* These floatformats should probably be renamed. MIPS uses
|
||||
the same 128-bit IEEE floating point format that IA-64 uses,
|
||||
|
@ -709,7 +709,7 @@ am33_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
set_gdbarch_iterate_over_regset_sections
|
||||
(gdbarch, am33_iterate_over_regset_sections);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe);
|
||||
tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
|
||||
|
@ -226,7 +226,7 @@ nios2_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
svr4_fetch_objfile_link_map);
|
||||
|
@ -143,7 +143,7 @@ or1k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
linux_init_abi (info, gdbarch, 0);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
@ -2035,7 +2035,7 @@ ppc_linux_init_abi (struct gdbarch_info info,
|
||||
/* Shared library handling. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, ppc_skip_trampoline_code);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Setting the correct XML syscall filename. */
|
||||
set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_PPC);
|
||||
@ -2087,7 +2087,7 @@ ppc_linux_init_abi (struct gdbarch_info info,
|
||||
/* Shared library handling. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Setting the correct XML syscall filename. */
|
||||
set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_PPC64);
|
||||
|
@ -187,8 +187,8 @@ riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
(riscv_isa_xlen (gdbarch) == 4
|
||||
? svr4_ilp32_fetch_link_map_offsets
|
||||
: svr4_lp64_fetch_link_map_offsets));
|
||||
? linux_ilp32_fetch_link_map_offsets
|
||||
: linux_lp64_fetch_link_map_offsets));
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
@ -1158,7 +1158,7 @@ s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
s390_linux_init_abi_any (info, gdbarch);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390);
|
||||
}
|
||||
|
||||
@ -1174,7 +1174,7 @@ s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
s390_linux_init_abi_any (info, gdbarch);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_lp64_fetch_link_map_offsets);
|
||||
linux_lp64_fetch_link_map_offsets);
|
||||
set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X);
|
||||
}
|
||||
|
||||
|
@ -189,7 +189,7 @@ sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
|
||||
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -436,7 +436,7 @@ sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux has SVR4-style shared libraries... */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* ...which means that we need some special handling when doing
|
||||
prologue analysis. */
|
||||
|
@ -383,7 +383,7 @@ sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux has SVR4-style shared libraries... */
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_lp64_fetch_link_map_offsets);
|
||||
(gdbarch, linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* ...which means that we need some special handling when doing
|
||||
prologue analysis. */
|
||||
|
@ -121,10 +121,10 @@ tilegx_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
if (arch_size == 32)
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_ilp32_fetch_link_map_offsets);
|
||||
linux_ilp32_fetch_link_map_offsets);
|
||||
else
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
svr4_lp64_fetch_link_map_offsets);
|
||||
linux_lp64_fetch_link_map_offsets);
|
||||
|
||||
/* Enable TLS support. */
|
||||
set_gdbarch_fetch_tls_load_module_address (gdbarch,
|
||||
|
@ -113,7 +113,7 @@ xtensa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
linux_init_abi (info, gdbarch, 0);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
(gdbarch, linux_ilp32_fetch_link_map_offsets);
|
||||
|
||||
set_gdbarch_gdb_signal_from_target (gdbarch,
|
||||
xtensa_linux_gdb_signal_from_target);
|
||||
|
Loading…
Reference in New Issue
Block a user