patches/gdb/6.3/650-debian_vsyscall-gdb-support.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jul 30 21:09:12 2007 +0000 (2007-07-30)
changeset 306 1984d7bcea28
permissions -rw-r--r--
Small typo fix.
yann@96
     1
Status: Checked in to HEAD after 6.3.
yann@96
     2
yann@96
     3
2004-11-07  Andrew Cagney  <cagney@redhat.com>
yann@96
     4
	    Daniel Jacobowitz  <dan@debian.org>
yann@96
     5
	    Roland McGrath  <roland@redhat.com>
yann@96
     6
yann@96
     7
	* Makefile.in (symfile-mem.o): Update dependencies.
yann@96
     8
	* i386-linux-tdep.c (i386_linux_dwarf_signal_frame_p): New.
yann@96
     9
	(i386_linux_init_abi): Call dwarf2_frame_set_signal_frame_p.
yann@96
    10
	* inf-ptrace.c (inf_ptrace_attach): Call
yann@96
    11
	observer_notify_inferior_created.
yann@96
    12
	* inftarg.c (child_attach): Likewise.
yann@96
    13
	* symfile-mem.c: Include "observer.h", "auxv.h", and "elf/common.h".
yann@96
    14
	(symbol_file_add_from_memory): Take NAME argument.  Use it for
yann@96
    15
	the new BFD's filename.
yann@96
    16
	(add_symbol_file_from_memory_command): Update call to
yann@96
    17
	symbol_file_add_from_memory.
yann@96
    18
	(struct symbol_file_add_from_memory_args, add_vsyscall_page)
yann@96
    19
	(symbol_file_add_from_memory_wrapper): New.
yann@96
    20
	(_initialize_symfile_mem): Register add_vsyscall_page as an
yann@96
    21
	inferior_created observer.
yann@96
    22
yann@96
    23
Index: gdb-6.3/gdb/i386-linux-tdep.c
yann@96
    24
===================================================================
yann@96
    25
--- gdb-6.3.orig/gdb/i386-linux-tdep.c	2004-08-06 16:58:28.000000000 -0400
yann@96
    26
+++ gdb-6.3/gdb/i386-linux-tdep.c	2004-11-10 00:55:06.669398770 -0500
yann@96
    27
@@ -27,6 +27,7 @@
yann@96
    28
 #include "inferior.h"
yann@96
    29
 #include "osabi.h"
yann@96
    30
 #include "reggroups.h"
yann@96
    31
+#include "dwarf2-frame.h"
yann@96
    32
 
yann@96
    33
 #include "gdb_string.h"
yann@96
    34
 
yann@96
    35
@@ -244,6 +245,27 @@ i386_linux_sigtramp_p (struct frame_info
yann@96
    36
 	  || strcmp ("__restore_rt", name) == 0);
yann@96
    37
 }
yann@96
    38
 
yann@96
    39
+/* Return one if the unwound PC from NEXT_FRAME is in a signal trampoline
yann@96
    40
+   which may have DWARF-2 CFI.  */
yann@96
    41
+
yann@96
    42
+static int
yann@96
    43
+i386_linux_dwarf_signal_frame_p (struct gdbarch *gdbarch,
yann@96
    44
+				 struct frame_info *next_frame)
yann@96
    45
+{
yann@96
    46
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
yann@96
    47
+  char *name;
yann@96
    48
+
yann@96
    49
+  find_pc_partial_function (pc, &name, NULL, NULL);
yann@96
    50
+
yann@96
    51
+  /* If a vsyscall DSO is in use, the signal trampolines may have these
yann@96
    52
+     names.  */
yann@96
    53
+  if (name && (strcmp (name, "__kernel_sigreturn") == 0
yann@96
    54
+	       || strcmp (name, "__kernel_rt_sigreturn") == 0))
yann@96
    55
+    return 1;
yann@96
    56
+
yann@96
    57
+  return 0;
yann@96
    58
+}
yann@96
    59
+
yann@96
    60
 /* Offset to struct sigcontext in ucontext, from <asm/ucontext.h>.  */
yann@96
    61
 #define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 20
yann@96
    62
 
yann@96
    63
@@ -414,6 +436,8 @@ i386_linux_init_abi (struct gdbarch_info
yann@96
    64
 
yann@96
    65
   /* GNU/Linux uses the dynamic linker included in the GNU C Library.  */
yann@96
    66
   set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
yann@96
    67
+
yann@96
    68
+  dwarf2_frame_set_signal_frame_p (gdbarch, i386_linux_dwarf_signal_frame_p);
yann@96
    69
 }
yann@96
    70
 
yann@96
    71
 /* Provide a prototype to silence -Wmissing-prototypes.  */
yann@96
    72
Index: gdb-6.3/gdb/inf-ptrace.c
yann@96
    73
===================================================================
yann@96
    74
--- gdb-6.3.orig/gdb/inf-ptrace.c	2004-10-15 09:29:33.000000000 -0400
yann@96
    75
+++ gdb-6.3/gdb/inf-ptrace.c	2004-11-10 00:53:43.697615843 -0500
yann@96
    76
@@ -220,6 +220,10 @@ inf_ptrace_attach (char *args, int from_
yann@96
    77
 
yann@96
    78
   inferior_ptid = pid_to_ptid (pid);
yann@96
    79
   push_target (ptrace_ops_hack);
yann@96
    80
+
yann@96
    81
+  /* Do this first, before anything has had a chance to query the
yann@96
    82
+     inferior's symbol table or similar.  */
yann@96
    83
+  observer_notify_inferior_created (&current_target, from_tty);
yann@96
    84
 }
yann@96
    85
 
yann@96
    86
 static void
yann@96
    87
Index: gdb-6.3/gdb/inftarg.c
yann@96
    88
===================================================================
yann@96
    89
--- gdb-6.3.orig/gdb/inftarg.c	2004-10-08 16:29:47.000000000 -0400
yann@96
    90
+++ gdb-6.3/gdb/inftarg.c	2004-11-10 00:53:43.711613107 -0500
yann@96
    91
@@ -211,6 +211,10 @@ child_attach (char *args, int from_tty)
yann@96
    92
   
yann@96
    93
   inferior_ptid = pid_to_ptid (pid);
yann@96
    94
   push_target (&deprecated_child_ops);
yann@96
    95
+
yann@96
    96
+  /* Do this first, before anything has had a chance to query the
yann@96
    97
+     inferior's symbol table or similar.  */
yann@96
    98
+  observer_notify_inferior_created (&current_target, from_tty);
yann@96
    99
 }
yann@96
   100
 
yann@96
   101
 #if !defined(CHILD_POST_ATTACH)
yann@96
   102
Index: gdb-6.3/gdb/symfile-mem.c
yann@96
   103
===================================================================
yann@96
   104
--- gdb-6.3.orig/gdb/symfile-mem.c	2004-07-17 10:24:07.000000000 -0400
yann@96
   105
+++ gdb-6.3/gdb/symfile-mem.c	2004-11-10 00:53:43.722610958 -0500
yann@96
   106
@@ -52,13 +52,19 @@
yann@96
   107
 #include "target.h"
yann@96
   108
 #include "value.h"
yann@96
   109
 #include "symfile.h"
yann@96
   110
+#include "observer.h"
yann@96
   111
+#include "auxv.h"
yann@96
   112
+#include "elf/common.h"
yann@96
   113
 
yann@96
   114
 
yann@96
   115
 /* Read inferior memory at ADDR to find the header of a loaded object file
yann@96
   116
    and read its in-core symbols out of inferior memory.  TEMPL is a bfd
yann@96
   117
-   representing the target's format.  */
yann@96
   118
+   representing the target's format.  NAME is the name to use for this
yann@96
   119
+   symbol file in messages; it can be NULL or a malloc-allocated string
yann@96
   120
+   which will be attached to the BFD.  */
yann@96
   121
 static struct objfile *
yann@96
   122
-symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, int from_tty)
yann@96
   123
+symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
yann@96
   124
+			     int from_tty)
yann@96
   125
 {
yann@96
   126
   struct objfile *objf;
yann@96
   127
   struct bfd *nbfd;
yann@96
   128
@@ -75,7 +81,10 @@ symbol_file_add_from_memory (struct bfd 
yann@96
   129
   if (nbfd == NULL)
yann@96
   130
     error ("Failed to read a valid object file image from memory.");
yann@96
   131
 
yann@96
   132
-  nbfd->filename = xstrdup ("shared object read from target memory");
yann@96
   133
+  if (name == NULL)
yann@96
   134
+    nbfd->filename = xstrdup ("shared object read from target memory");
yann@96
   135
+  else
yann@96
   136
+    nbfd->filename = name;
yann@96
   137
 
yann@96
   138
   if (!bfd_check_format (nbfd, bfd_object))
yann@96
   139
     {
yann@96
   140
@@ -129,7 +138,73 @@ add_symbol_file_from_memory_command (cha
yann@96
   141
     error ("\
yann@96
   142
 Must use symbol-file or exec-file before add-symbol-file-from-memory.");
yann@96
   143
 
yann@96
   144
-  symbol_file_add_from_memory (templ, addr, from_tty);
yann@96
   145
+  symbol_file_add_from_memory (templ, addr, NULL, from_tty);
yann@96
   146
+}
yann@96
   147
+
yann@96
   148
+/* Arguments for symbol_file_add_from_memory_wrapper.  */
yann@96
   149
+
yann@96
   150
+struct symbol_file_add_from_memory_args
yann@96
   151
+{
yann@96
   152
+  struct bfd *bfd;
yann@96
   153
+  CORE_ADDR sysinfo_ehdr;
yann@96
   154
+  char *name;
yann@96
   155
+  int from_tty;
yann@96
   156
+};
yann@96
   157
+
yann@96
   158
+/* Wrapper function for symbol_file_add_from_memory, for
yann@96
   159
+   catch_exceptions.  */
yann@96
   160
+
yann@96
   161
+static int
yann@96
   162
+symbol_file_add_from_memory_wrapper (struct ui_out *uiout, void *data)
yann@96
   163
+{
yann@96
   164
+  struct symbol_file_add_from_memory_args *args = data;
yann@96
   165
+
yann@96
   166
+  symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args->name,
yann@96
   167
+			       args->from_tty);
yann@96
   168
+  return 0;
yann@96
   169
+}
yann@96
   170
+
yann@96
   171
+/* Try to add the symbols for the vsyscall page, if there is one.  This function
yann@96
   172
+   is called via the inferior_created observer.  */
yann@96
   173
+
yann@96
   174
+static void
yann@96
   175
+add_vsyscall_page (struct target_ops *target, int from_tty)
yann@96
   176
+{
yann@96
   177
+  CORE_ADDR sysinfo_ehdr;
yann@96
   178
+
yann@96
   179
+  if (target_auxv_search (target, AT_SYSINFO_EHDR, &sysinfo_ehdr) > 0
yann@96
   180
+      && sysinfo_ehdr != (CORE_ADDR) 0)
yann@96
   181
+    {
yann@96
   182
+      struct bfd *bfd;
yann@96
   183
+      struct symbol_file_add_from_memory_args args;
yann@96
   184
+
yann@96
   185
+      if (core_bfd != NULL)
yann@96
   186
+	bfd = core_bfd;
yann@96
   187
+      else if (exec_bfd != NULL)
yann@96
   188
+	bfd = exec_bfd;
yann@96
   189
+      else
yann@96
   190
+       /* FIXME: cagney/2004-05-06: Should not require an existing
yann@96
   191
+	  BFD when trying to create a run-time BFD of the VSYSCALL
yann@96
   192
+	  page in the inferior.  Unfortunately that's the current
yann@96
   193
+	  interface so for the moment bail.  Introducing a
yann@96
   194
+	  ``bfd_runtime'' (a BFD created using the loaded image) file
yann@96
   195
+	  format should fix this.  */
yann@96
   196
+	{
yann@96
   197
+	  warning ("could not load vsyscall page because no executable was specified");
yann@96
   198
+	  warning ("try using the \"file\" command first");
yann@96
   199
+	  return;
yann@96
   200
+	}
yann@96
   201
+      args.bfd = bfd;
yann@96
   202
+      args.sysinfo_ehdr = sysinfo_ehdr;
yann@96
   203
+      xasprintf (&args.name, "system-supplied DSO at 0x%s",
yann@96
   204
+		 paddr_nz (sysinfo_ehdr));
yann@96
   205
+      /* Pass zero for FROM_TTY, because the action of loading the
yann@96
   206
+	 vsyscall DSO was not triggered by the user, even if the user
yann@96
   207
+	 typed "run" at the TTY.  */
yann@96
   208
+      args.from_tty = 0;
yann@96
   209
+      catch_exceptions (uiout, symbol_file_add_from_memory_wrapper,
yann@96
   210
+			&args, NULL, RETURN_MASK_ALL);
yann@96
   211
+    }
yann@96
   212
 }
yann@96
   213
 
yann@96
   214
 
yann@96
   215
@@ -143,4 +218,7 @@ Load the symbols out of memory from a dy
yann@96
   216
 Give an expression for the address of the file's shared object file header.",
yann@96
   217
            &cmdlist);
yann@96
   218
 
yann@96
   219
+  /* Want to know of each new inferior so that its vsyscall info can
yann@96
   220
+     be extracted.  */
yann@96
   221
+  observer_attach_inferior_created (add_vsyscall_page);
yann@96
   222
 }
yann@96
   223
Index: gdb-6.3/gdb/Makefile.in
yann@96
   224
===================================================================
yann@96
   225
--- gdb-6.3.orig/gdb/Makefile.in	2004-11-10 00:29:00.000000000 -0500
yann@96
   226
+++ gdb-6.3/gdb/Makefile.in	2004-11-10 00:54:47.728100986 -0500
yann@96
   227
@@ -2020,7 +2020,7 @@ i386-linux-nat.o: i386-linux-nat.c $(def
yann@96
   228
 i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
yann@96
   229
 	$(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \
yann@96
   230
 	$(gdb_string_h) $(i386_tdep_h) $(i386_linux_tdep_h) $(glibc_tdep_h) \
yann@96
   231
-	$(solib_svr4_h)
yann@96
   232
+	$(solib_svr4_h) $(dwarf2_frame_h)
yann@96
   233
 i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
yann@96
   234
 	$(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
yann@96
   235
 i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
yann@96
   236
@@ -2606,7 +2606,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
yann@96
   237
 	$(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \
yann@96
   238
 	$(gdb_string_h) $(gdb_stat_h)
yann@96
   239
 symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \
yann@96
   240
-	$(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h)
yann@96
   241
+	$(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h) \
yann@96
   242
+	$(observer_h) $(auxv_h) $(elf_common_h)
yann@96
   243
 symmisc.o: symmisc.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(bfd_h) \
yann@96
   244
 	$(symfile_h) $(objfiles_h) $(breakpoint_h) $(command_h) \
yann@96
   245
 	$(gdb_obstack_h) $(language_h) $(bcache_h) $(block_h) $(gdb_regex_h) \