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