X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Flinux-tdep.c;h=c51ede9c618f8eb99f3c483a36020b70560b3e05;hb=809df4465f01277ab689fb82b3f16ff79f9a2606;hp=1717e55c78f4f9560d9d25ac33b91ad9550a9eb1;hpb=4c38e0a4fcb69f8586d8db0b9cdb8dbab5980811;p=binutils-gdb.git diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index 1717e55c78f..c51ede9c618 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -18,14 +18,31 @@ along with this program. If not, see . */ #include "defs.h" -#include "gdbcore.h" #include "gdbtypes.h" #include "linux-tdep.h" -#include "observer.h" #include "auxv.h" #include "target.h" -#include "elf-bfd.h" #include "elf/common.h" +#include "inferior.h" + +static struct gdbarch_data *linux_gdbarch_data_handle; + +struct linux_gdbarch_data + { + struct type *siginfo_type; + }; + +static void * +init_linux_gdbarch_data (struct gdbarch *gdbarch) +{ + return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct linux_gdbarch_data); +} + +static struct linux_gdbarch_data * +get_linux_gdbarch_data (struct gdbarch *gdbarch) +{ + return gdbarch_data (gdbarch, linux_gdbarch_data_handle); +} /* This function is suitable for architectures that don't extend/override the standard siginfo structure. */ @@ -33,12 +50,17 @@ struct type * linux_get_siginfo_type (struct gdbarch *gdbarch) { + struct linux_gdbarch_data *linux_gdbarch_data; struct type *int_type, *uint_type, *long_type, *void_ptr_type; struct type *uid_type, *pid_type; struct type *sigval_type, *clock_type; struct type *siginfo_type, *sifields_type; struct type *type; + linux_gdbarch_data = get_linux_gdbarch_data (gdbarch); + if (linux_gdbarch_data->siginfo_type != NULL) + return linux_gdbarch_data->siginfo_type; + int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, "int"); uint_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), @@ -138,6 +160,8 @@ linux_get_siginfo_type (struct gdbarch *gdbarch) "_sifields", sifields_type, TYPE_LENGTH (long_type)); + linux_gdbarch_data->siginfo_type = siginfo_type; + return siginfo_type; } @@ -156,32 +180,34 @@ linux_has_shared_address_space (void) return target_is_uclinux; } -/* Observer for the executable_changed event, to check whether the new - exec binary is a PIE (Position Independent Executable) specimen, which - is currently unsupported. */ +/* This is how we want PTIDs from core files to be printed. */ -static void -check_is_pie_binary (void) +static char * +linux_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid) { - Elf_Internal_Ehdr *elf_hdr; - - if (!exec_bfd) - return; - else if (bfd_get_flavour (exec_bfd) != bfd_target_elf_flavour) - return; - - if (elf_tdata (exec_bfd)->elf_header->e_type == ET_DYN) - warning (_("\ -The current binary is a PIE (Position Independent Executable), which\n\ -GDB does NOT currently support. Most debugger features will fail if used\n\ -in this session.\n")); + static char buf[80]; + + if (ptid_get_lwp (ptid) != 0) + { + snprintf (buf, sizeof (buf), "LWP %ld", ptid_get_lwp (ptid)); + return buf; + } + + return normal_pid_to_str (ptid); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_linux_tdep; +/* To be called from the various GDB_OSABI_LINUX handlers for the + various GNU/Linux architectures and machine types. */ + +void +linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + set_gdbarch_core_pid_to_str (gdbarch, linux_core_pid_to_str); +} void _initialize_linux_tdep (void) { - observer_attach_executable_changed (check_is_pie_binary); + linux_gdbarch_data_handle = + gdbarch_data_register_post_init (init_linux_gdbarch_data); }