yann@96: Status: Checked in to HEAD after 6.3. yann@96: yann@96: 2004-11-07 Andrew Cagney yann@96: Daniel Jacobowitz yann@96: Roland McGrath yann@96: yann@96: * Makefile.in (symfile-mem.o): Update dependencies. yann@96: * i386-linux-tdep.c (i386_linux_dwarf_signal_frame_p): New. yann@96: (i386_linux_init_abi): Call dwarf2_frame_set_signal_frame_p. yann@96: * inf-ptrace.c (inf_ptrace_attach): Call yann@96: observer_notify_inferior_created. yann@96: * inftarg.c (child_attach): Likewise. yann@96: * symfile-mem.c: Include "observer.h", "auxv.h", and "elf/common.h". yann@96: (symbol_file_add_from_memory): Take NAME argument. Use it for yann@96: the new BFD's filename. yann@96: (add_symbol_file_from_memory_command): Update call to yann@96: symbol_file_add_from_memory. yann@96: (struct symbol_file_add_from_memory_args, add_vsyscall_page) yann@96: (symbol_file_add_from_memory_wrapper): New. yann@96: (_initialize_symfile_mem): Register add_vsyscall_page as an yann@96: inferior_created observer. yann@96: yann@96: Index: gdb-6.3/gdb/i386-linux-tdep.c yann@96: =================================================================== yann@96: --- gdb-6.3.orig/gdb/i386-linux-tdep.c 2004-08-06 16:58:28.000000000 -0400 yann@96: +++ gdb-6.3/gdb/i386-linux-tdep.c 2004-11-10 00:55:06.669398770 -0500 yann@96: @@ -27,6 +27,7 @@ yann@96: #include "inferior.h" yann@96: #include "osabi.h" yann@96: #include "reggroups.h" yann@96: +#include "dwarf2-frame.h" yann@96: yann@96: #include "gdb_string.h" yann@96: yann@96: @@ -244,6 +245,27 @@ i386_linux_sigtramp_p (struct frame_info yann@96: || strcmp ("__restore_rt", name) == 0); yann@96: } yann@96: yann@96: +/* Return one if the unwound PC from NEXT_FRAME is in a signal trampoline yann@96: + which may have DWARF-2 CFI. */ yann@96: + yann@96: +static int yann@96: +i386_linux_dwarf_signal_frame_p (struct gdbarch *gdbarch, yann@96: + struct frame_info *next_frame) yann@96: +{ yann@96: + CORE_ADDR pc = frame_pc_unwind (next_frame); yann@96: + char *name; yann@96: + yann@96: + find_pc_partial_function (pc, &name, NULL, NULL); yann@96: + yann@96: + /* If a vsyscall DSO is in use, the signal trampolines may have these yann@96: + names. */ yann@96: + if (name && (strcmp (name, "__kernel_sigreturn") == 0 yann@96: + || strcmp (name, "__kernel_rt_sigreturn") == 0)) yann@96: + return 1; yann@96: + yann@96: + return 0; yann@96: +} yann@96: + yann@96: /* Offset to struct sigcontext in ucontext, from . */ yann@96: #define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 20 yann@96: yann@96: @@ -414,6 +436,8 @@ i386_linux_init_abi (struct gdbarch_info yann@96: yann@96: /* GNU/Linux uses the dynamic linker included in the GNU C Library. */ yann@96: set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); yann@96: + yann@96: + dwarf2_frame_set_signal_frame_p (gdbarch, i386_linux_dwarf_signal_frame_p); yann@96: } yann@96: yann@96: /* Provide a prototype to silence -Wmissing-prototypes. */ yann@96: Index: gdb-6.3/gdb/inf-ptrace.c yann@96: =================================================================== yann@96: --- gdb-6.3.orig/gdb/inf-ptrace.c 2004-10-15 09:29:33.000000000 -0400 yann@96: +++ gdb-6.3/gdb/inf-ptrace.c 2004-11-10 00:53:43.697615843 -0500 yann@96: @@ -220,6 +220,10 @@ inf_ptrace_attach (char *args, int from_ yann@96: yann@96: inferior_ptid = pid_to_ptid (pid); yann@96: push_target (ptrace_ops_hack); yann@96: + yann@96: + /* Do this first, before anything has had a chance to query the yann@96: + inferior's symbol table or similar. */ yann@96: + observer_notify_inferior_created (¤t_target, from_tty); yann@96: } yann@96: yann@96: static void yann@96: Index: gdb-6.3/gdb/inftarg.c yann@96: =================================================================== yann@96: --- gdb-6.3.orig/gdb/inftarg.c 2004-10-08 16:29:47.000000000 -0400 yann@96: +++ gdb-6.3/gdb/inftarg.c 2004-11-10 00:53:43.711613107 -0500 yann@96: @@ -211,6 +211,10 @@ child_attach (char *args, int from_tty) yann@96: yann@96: inferior_ptid = pid_to_ptid (pid); yann@96: push_target (&deprecated_child_ops); yann@96: + yann@96: + /* Do this first, before anything has had a chance to query the yann@96: + inferior's symbol table or similar. */ yann@96: + observer_notify_inferior_created (¤t_target, from_tty); yann@96: } yann@96: yann@96: #if !defined(CHILD_POST_ATTACH) yann@96: Index: gdb-6.3/gdb/symfile-mem.c yann@96: =================================================================== yann@96: --- gdb-6.3.orig/gdb/symfile-mem.c 2004-07-17 10:24:07.000000000 -0400 yann@96: +++ gdb-6.3/gdb/symfile-mem.c 2004-11-10 00:53:43.722610958 -0500 yann@96: @@ -52,13 +52,19 @@ yann@96: #include "target.h" yann@96: #include "value.h" yann@96: #include "symfile.h" yann@96: +#include "observer.h" yann@96: +#include "auxv.h" yann@96: +#include "elf/common.h" yann@96: yann@96: yann@96: /* Read inferior memory at ADDR to find the header of a loaded object file yann@96: and read its in-core symbols out of inferior memory. TEMPL is a bfd yann@96: - representing the target's format. */ yann@96: + representing the target's format. NAME is the name to use for this yann@96: + symbol file in messages; it can be NULL or a malloc-allocated string yann@96: + which will be attached to the BFD. */ yann@96: static struct objfile * yann@96: -symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, int from_tty) yann@96: +symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name, yann@96: + int from_tty) yann@96: { yann@96: struct objfile *objf; yann@96: struct bfd *nbfd; yann@96: @@ -75,7 +81,10 @@ symbol_file_add_from_memory (struct bfd yann@96: if (nbfd == NULL) yann@96: error ("Failed to read a valid object file image from memory."); yann@96: yann@96: - nbfd->filename = xstrdup ("shared object read from target memory"); yann@96: + if (name == NULL) yann@96: + nbfd->filename = xstrdup ("shared object read from target memory"); yann@96: + else yann@96: + nbfd->filename = name; yann@96: yann@96: if (!bfd_check_format (nbfd, bfd_object)) yann@96: { yann@96: @@ -129,7 +138,73 @@ add_symbol_file_from_memory_command (cha yann@96: error ("\ yann@96: Must use symbol-file or exec-file before add-symbol-file-from-memory."); yann@96: yann@96: - symbol_file_add_from_memory (templ, addr, from_tty); yann@96: + symbol_file_add_from_memory (templ, addr, NULL, from_tty); yann@96: +} yann@96: + yann@96: +/* Arguments for symbol_file_add_from_memory_wrapper. */ yann@96: + yann@96: +struct symbol_file_add_from_memory_args yann@96: +{ yann@96: + struct bfd *bfd; yann@96: + CORE_ADDR sysinfo_ehdr; yann@96: + char *name; yann@96: + int from_tty; yann@96: +}; yann@96: + yann@96: +/* Wrapper function for symbol_file_add_from_memory, for yann@96: + catch_exceptions. */ yann@96: + yann@96: +static int yann@96: +symbol_file_add_from_memory_wrapper (struct ui_out *uiout, void *data) yann@96: +{ yann@96: + struct symbol_file_add_from_memory_args *args = data; yann@96: + yann@96: + symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args->name, yann@96: + args->from_tty); yann@96: + return 0; yann@96: +} yann@96: + yann@96: +/* Try to add the symbols for the vsyscall page, if there is one. This function yann@96: + is called via the inferior_created observer. */ yann@96: + yann@96: +static void yann@96: +add_vsyscall_page (struct target_ops *target, int from_tty) yann@96: +{ yann@96: + CORE_ADDR sysinfo_ehdr; yann@96: + yann@96: + if (target_auxv_search (target, AT_SYSINFO_EHDR, &sysinfo_ehdr) > 0 yann@96: + && sysinfo_ehdr != (CORE_ADDR) 0) yann@96: + { yann@96: + struct bfd *bfd; yann@96: + struct symbol_file_add_from_memory_args args; yann@96: + yann@96: + if (core_bfd != NULL) yann@96: + bfd = core_bfd; yann@96: + else if (exec_bfd != NULL) yann@96: + bfd = exec_bfd; yann@96: + else yann@96: + /* FIXME: cagney/2004-05-06: Should not require an existing yann@96: + BFD when trying to create a run-time BFD of the VSYSCALL yann@96: + page in the inferior. Unfortunately that's the current yann@96: + interface so for the moment bail. Introducing a yann@96: + ``bfd_runtime'' (a BFD created using the loaded image) file yann@96: + format should fix this. */ yann@96: + { yann@96: + warning ("could not load vsyscall page because no executable was specified"); yann@96: + warning ("try using the \"file\" command first"); yann@96: + return; yann@96: + } yann@96: + args.bfd = bfd; yann@96: + args.sysinfo_ehdr = sysinfo_ehdr; yann@96: + xasprintf (&args.name, "system-supplied DSO at 0x%s", yann@96: + paddr_nz (sysinfo_ehdr)); yann@96: + /* Pass zero for FROM_TTY, because the action of loading the yann@96: + vsyscall DSO was not triggered by the user, even if the user yann@96: + typed "run" at the TTY. */ yann@96: + args.from_tty = 0; yann@96: + catch_exceptions (uiout, symbol_file_add_from_memory_wrapper, yann@96: + &args, NULL, RETURN_MASK_ALL); yann@96: + } yann@96: } yann@96: yann@96: yann@96: @@ -143,4 +218,7 @@ Load the symbols out of memory from a dy yann@96: Give an expression for the address of the file's shared object file header.", yann@96: &cmdlist); yann@96: yann@96: + /* Want to know of each new inferior so that its vsyscall info can yann@96: + be extracted. */ yann@96: + observer_attach_inferior_created (add_vsyscall_page); yann@96: } yann@96: Index: gdb-6.3/gdb/Makefile.in yann@96: =================================================================== yann@96: --- gdb-6.3.orig/gdb/Makefile.in 2004-11-10 00:29:00.000000000 -0500 yann@96: +++ gdb-6.3/gdb/Makefile.in 2004-11-10 00:54:47.728100986 -0500 yann@96: @@ -2020,7 +2020,7 @@ i386-linux-nat.o: i386-linux-nat.c $(def yann@96: i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \ yann@96: $(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \ yann@96: $(gdb_string_h) $(i386_tdep_h) $(i386_linux_tdep_h) $(glibc_tdep_h) \ yann@96: - $(solib_svr4_h) yann@96: + $(solib_svr4_h) $(dwarf2_frame_h) yann@96: i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \ yann@96: $(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h) yann@96: i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h) yann@96: @@ -2606,7 +2606,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink yann@96: $(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \ yann@96: $(gdb_string_h) $(gdb_stat_h) yann@96: symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \ yann@96: - $(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h) yann@96: + $(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h) \ yann@96: + $(observer_h) $(auxv_h) $(elf_common_h) yann@96: symmisc.o: symmisc.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(bfd_h) \ yann@96: $(symfile_h) $(objfiles_h) $(breakpoint_h) $(command_h) \ yann@96: $(gdb_obstack_h) $(language_h) $(bcache_h) $(block_h) $(gdb_regex_h) \