rpms/gdb/F-9 gdb-6.3-pie-20050110.patch, 1.9, 1.10 gdb.spec, 1.296, 1.297

Jan Kratochvil jkratoch at fedoraproject.org
Tue Sep 2 00:31:01 UTC 2008


Author: jkratoch

Update of /cvs/pkgs/rpms/gdb/F-9
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv10836

Modified Files:
	gdb-6.3-pie-20050110.patch gdb.spec 
Log Message:
* Tue Sep  2 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-22
- Fix PIE patch regression for loading binaries from valgrind (BZ 460319).


gdb-6.3-pie-20050110.patch:

Index: gdb-6.3-pie-20050110.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/F-9/gdb-6.3-pie-20050110.patch,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- gdb-6.3-pie-20050110.patch	1 Jun 2008 13:15:47 -0000	1.9
+++ gdb-6.3-pie-20050110.patch	2 Sep 2008 00:31:01 -0000	1.10
@@ -22,23 +22,127 @@
 
 	Fix crash on a watchpoint update on an inferior stop.
 
-Index: gdb-6.8/gdb/dwarf2read.c
-===================================================================
---- gdb-6.8.orig/gdb/dwarf2read.c	2008-04-19 21:38:32.000000000 +0200
-+++ gdb-6.8/gdb/dwarf2read.c	2008-04-19 21:38:33.000000000 +0200
-@@ -1221,7 +1221,7 @@ dwarf2_build_psymtabs (struct objfile *o
-   else
-     dwarf2_per_objfile->loc_buffer = NULL;
+2008-09-01  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Fix scan_dyntag() for binaries provided by valgrind (BZ 460319).
+
+--- ./gdb/Makefile.in	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/Makefile.in	2008-08-30 23:40:33.000000000 +0200
+@@ -1928,7 +1928,7 @@ amd64-tdep.o: amd64-tdep.c $(defs_h) $(a
+ 	$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
+ 	$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
+ 	$(regset_h) $(symfile_h) $(gdb_assert_h) $(amd64_tdep_h) \
+-	$(i387_tdep_h)
++	$(i387_tdep_h) $(exceptions_h)
+ annotate.o: annotate.c $(defs_h) $(annotate_h) $(value_h) $(target_h) \
+ 	$(gdbtypes_h) $(breakpoint_h)
+ arch-utils.o: arch-utils.c $(defs_h) $(arch_utils_h) $(buildsym_h) \
+--- ./gdb/amd64-tdep.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/amd64-tdep.c	2008-08-30 23:40:33.000000000 +0200
+@@ -36,6 +36,7 @@
+ #include "symfile.h"
+ #include "dwarf2-frame.h"
+ #include "gdb_assert.h"
++#include "exceptions.h"
  
--  if (mainline
-+  if ((mainline == 1)
-       || (objfile->global_psymbols.size == 0
- 	  && objfile->static_psymbols.size == 0))
-     {
-Index: gdb-6.8/gdb/auxv.c
-===================================================================
---- gdb-6.8.orig/gdb/auxv.c	2008-01-16 17:27:37.000000000 +0100
-+++ gdb-6.8/gdb/auxv.c	2008-04-19 21:38:33.000000000 +0200
+ #include "amd64-tdep.h"
+ #include "i387-tdep.h"
+@@ -731,16 +732,28 @@ amd64_alloc_frame_cache (void)
+    Any function that doesn't start with this sequence will be assumed
+    to have no prologue and thus no valid frame pointer in %rbp.  */
+ 
+-static CORE_ADDR
+-amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
+-			struct amd64_frame_cache *cache)
++struct amd64_analyze_prologue_data
++  {
++    CORE_ADDR pc, current_pc;
++    struct amd64_frame_cache *cache;
++    CORE_ADDR retval;
++  };
++
++static int
++amd64_analyze_prologue_1 (void *data_pointer)
+ {
++  struct amd64_analyze_prologue_data *data = data_pointer;
++  CORE_ADDR pc = data->pc, current_pc = data->current_pc;
++  struct amd64_frame_cache *cache = data->cache;
+   static gdb_byte proto[3] = { 0x48, 0x89, 0xe5 }; /* movq %rsp, %rbp */
+   gdb_byte buf[3];
+   gdb_byte op;
+ 
+   if (current_pc <= pc)
+-    return current_pc;
++    {
++      data->retval = current_pc;
++      return 1;
++    }
+ 
+   op = read_memory_unsigned_integer (pc, 1);
+ 
+@@ -753,18 +766,57 @@ amd64_analyze_prologue (CORE_ADDR pc, CO
+ 
+       /* If that's all, return now.  */
+       if (current_pc <= pc + 1)
+-        return current_pc;
++        {
++	  data->retval = current_pc;
++	  return 1;
++        }
+ 
+       /* Check for `movq %rsp, %rbp'.  */
+       read_memory (pc + 1, buf, 3);
+       if (memcmp (buf, proto, 3) != 0)
+-	return pc + 1;
++	{
++	  data->retval = pc + 1;
++	  return 1;
++	}
+ 
+       /* OK, we actually have a frame.  */
+       cache->frameless_p = 0;
+-      return pc + 4;
++      data->retval = pc + 4;
++      return 1;
+     }
+ 
++  data->retval = pc;
++  return 1;
++}
++
++/* Catch memory read errors and return just PC in such case.
++   It occurs very early on enable_break->new_symfile_objfile->
++   ->breakpoint_re_set->decode_line_1->decode_variable_1->
++   ->find_function_start_sal  */
++
++static CORE_ADDR
++amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
++			struct amd64_frame_cache *cache)
++{
++  int status;
++  struct amd64_analyze_prologue_data data;
++  struct ui_file *saved_gdb_stderr;
++
++  /* Suppress error messages.  */
++  saved_gdb_stderr = gdb_stderr;
++  gdb_stderr = ui_file_new ();
++
++  data.pc = pc;
++  data.current_pc = current_pc;
++  data.cache = cache;
++  status = catch_errors (amd64_analyze_prologue_1, &data, "", RETURN_MASK_ALL);
++
++  /* Stop suppressing error messages.  */
++  ui_file_delete (gdb_stderr);
++  gdb_stderr = saved_gdb_stderr;
++
++  if (status)
++    return data.retval;
+   return pc;
+ }
+ 
+--- ./gdb/auxv.c	2008-01-16 17:27:37.000000000 +0100
++++ ./gdb/auxv.c	2008-08-30 23:40:33.000000000 +0200
 @@ -80,7 +80,7 @@ procfs_xfer_auxv (struct target_ops *ops
     Return 1 if an entry was read into *TYPEP and *VALP.  */
  int
@@ -110,10 +214,8 @@
        switch (flavor)
  	{
  	case dec:
-Index: gdb-6.8/gdb/auxv.h
-===================================================================
---- gdb-6.8.orig/gdb/auxv.h	2008-01-01 23:53:09.000000000 +0100
-+++ gdb-6.8/gdb/auxv.h	2008-04-19 21:38:33.000000000 +0200
+--- ./gdb/auxv.h	2008-01-01 23:53:09.000000000 +0100
++++ ./gdb/auxv.h	2008-08-30 23:40:33.000000000 +0200
 @@ -35,14 +35,14 @@ struct target_ops;		/* Forward declarati
     Return 1 if an entry was read into *TYPEP and *VALP.  */
  extern int target_auxv_parse (struct target_ops *ops,
@@ -131,10 +233,83 @@
  
  /* Print the contents of the target's AUXV on the specified file. */
  extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
-Index: gdb-6.8/gdb/breakpoint.h
-===================================================================
---- gdb-6.8.orig/gdb/breakpoint.h	2008-04-19 21:38:33.000000000 +0200
-+++ gdb-6.8/gdb/breakpoint.h	2008-04-19 21:38:33.000000000 +0200
+--- ./gdb/breakpoint.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/breakpoint.c	2008-08-30 23:40:33.000000000 +0200
+@@ -3971,7 +3971,8 @@ describe_other_breakpoints (CORE_ADDR pc
+ 	      printf_filtered (" (thread %d)", b->thread);
+ 	    printf_filtered ("%s%s ",
+ 			     ((b->enable_state == bp_disabled || 
+-			       b->enable_state == bp_call_disabled) 
++			       b->enable_state == bp_call_disabled ||
++			       b->enable_state == bp_startup_disabled)
+ 			      ? " (disabled)"
+ 			      : b->enable_state == bp_permanent 
+ 			      ? " (permanent)"
+@@ -4623,6 +4624,62 @@ disable_breakpoints_in_unloaded_shlib (s
+   }
+ }
+ 
++void
++disable_breakpoints_at_startup (int silent)
++{
++  struct breakpoint *b;
++  int disabled_startup_breaks = 0;
++
++  if (bfd_get_start_address (exec_bfd) != entry_point_address ())
++    {
++      ALL_BREAKPOINTS (b)
++	{
++	  if (((b->type == bp_breakpoint) ||
++	       (b->type == bp_hardware_breakpoint)) &&
++	      b->enable_state == bp_enabled &&
++	      !b->loc->duplicate)
++	    {
++	      b->enable_state = bp_startup_disabled;
++	      if (!silent)
++		{
++		  if (!disabled_startup_breaks)
++		    {
++		      target_terminal_ours_for_output ();
++		      warning ("Temporarily disabling breakpoints:");
++		    }
++		  disabled_startup_breaks = 1;
++		  warning ("breakpoint #%d addr 0x%s", b->number, paddr_nz(b->loc->address));
++		}
++	    }
++	}
++    }
++}
++
++/* Try to reenable any breakpoints after startup.  */
++void
++re_enable_breakpoints_at_startup (void)
++{
++  struct breakpoint *b;
++
++  if (bfd_get_start_address (exec_bfd) != entry_point_address ())
++    {
++      ALL_BREAKPOINTS (b)
++	if (b->enable_state == bp_startup_disabled)
++	  {
++	    char buf[1];
++
++	    /* Do not reenable the breakpoint if the shared library
++	       is still not mapped in.  */
++	    if (target_read_memory (b->loc->address, buf, 1) == 0)
++	      {
++		/*printf ("enabling breakpoint at 0x%s\n", paddr_nz(b->loc->address));*/
++		b->enable_state = bp_enabled;
++	      }
++	  }
++    }
++}
++
++
+ static void
+ create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
+ 				    enum bptype bp_kind)
+--- ./gdb/breakpoint.h	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/breakpoint.h	2008-08-30 23:40:33.000000000 +0200
 @@ -144,6 +144,7 @@ enum enable_state
  			   automatically enabled and reset when the call 
  			   "lands" (either completes, or stops at another 
@@ -154,24 +329,31 @@
  /* This function returns TRUE if ep is a catchpoint. */
  extern int ep_is_catchpoint (struct breakpoint *);
  
-Index: gdb-6.8/gdb/symfile-mem.c
-===================================================================
---- gdb-6.8.orig/gdb/symfile-mem.c	2008-04-19 21:38:27.000000000 +0200
-+++ gdb-6.8/gdb/symfile-mem.c	2008-04-19 21:38:33.000000000 +0200
-@@ -116,7 +116,7 @@ symbol_file_add_from_memory (struct bfd 
-       }
- 
-   objf = symbol_file_add_from_bfd (nbfd, from_tty,
--                                   sai, 0, OBJF_SHARED);
-+                                   sai, 2, OBJF_SHARED);
+--- ./gdb/dwarf2read.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/dwarf2read.c	2008-08-30 23:40:33.000000000 +0200
+@@ -1222,7 +1222,7 @@ dwarf2_build_psymtabs (struct objfile *o
+   else
+     dwarf2_per_objfile->loc_buffer = NULL;
  
-   /* This might change our ideas about frames already looked at.  */
-   reinit_frame_cache ();
-Index: gdb-6.8/gdb/infrun.c
-===================================================================
---- gdb-6.8.orig/gdb/infrun.c	2008-04-19 21:38:29.000000000 +0200
-+++ gdb-6.8/gdb/infrun.c	2008-04-19 21:38:33.000000000 +0200
-@@ -2277,6 +2277,11 @@ process_event_stop_test:
+-  if (mainline
++  if ((mainline == 1)
+       || (objfile->global_psymbols.size == 0
+ 	  && objfile->static_psymbols.size == 0))
+     {
+--- ./gdb/elfread.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/elfread.c	2008-08-30 23:40:33.000000000 +0200
+@@ -673,7 +673,7 @@ elf_symfile_read (struct objfile *objfil
+   /* If we are reinitializing, or if we have never loaded syms yet,
+      set table to empty.  MAINLINE is cleared so that *_read_psymtab
+      functions do not all also re-initialize the psymbol table. */
+-  if (mainline)
++  if (mainline == 1)
+     {
+       init_psymbol_list (objfile, 0);
+       mainline = 0;
+--- ./gdb/infrun.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/infrun.c	2008-08-30 23:40:33.000000000 +0200
+@@ -2314,6 +2314,11 @@ process_event_stop_test:
  #endif
  	  target_terminal_inferior ();
  
@@ -183,10 +365,8 @@
  	  /* If requested, stop when the dynamic linker notifies
  	     gdb of events.  This allows the user to get control
  	     and place breakpoints in initializer routines for
-Index: gdb-6.8/gdb/objfiles.c
-===================================================================
---- gdb-6.8.orig/gdb/objfiles.c	2008-01-01 23:53:12.000000000 +0100
-+++ gdb-6.8/gdb/objfiles.c	2008-04-19 21:38:33.000000000 +0200
+--- ./gdb/objfiles.c	2008-01-01 23:53:12.000000000 +0100
++++ ./gdb/objfiles.c	2008-08-30 23:40:33.000000000 +0200
 @@ -49,6 +49,9 @@
  #include "source.h"
  #include "addrmap.h"
@@ -218,10 +398,8 @@
  }
  
  /* Create the terminating entry of OBJFILE's minimal symbol table.
-Index: gdb-6.8/gdb/solib-svr4.c
-===================================================================
---- gdb-6.8.orig/gdb/solib-svr4.c	2008-04-19 21:38:30.000000000 +0200
-+++ gdb-6.8/gdb/solib-svr4.c	2008-04-19 21:34:42.000000000 +0200
+--- ./gdb/solib-svr4.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/solib-svr4.c	2008-09-01 17:12:31.000000000 +0200
 @@ -31,6 +31,8 @@
  #include "gdbcore.h"
  #include "target.h"
@@ -245,7 +423,7 @@
    int arch_size, step, sect_size;
    long dyn_tag;
    CORE_ADDR dyn_ptr, dyn_addr;
-+  CORE_ADDR entry_addr;
++  CORE_ADDR reloc_addr = 0;
    gdb_byte *bufend, *bufstart, *buf;
    Elf32_External_Dyn *x_dynp_32;
    Elf64_External_Dyn *x_dynp_64;
@@ -254,7 +432,7 @@
  
    if (abfd == NULL)
      return 0;
-@@ -360,19 +366,74 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
+@@ -360,19 +366,81 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
    if (arch_size == -1)
     return 0;
  
@@ -264,6 +442,8 @@
 +
 +  if (ptr != NULL)
 +    {
++      CORE_ADDR entry_addr;
++
 +      /* Find the address of the entry point of the program from the
 +	 auxv vector.  */
 +      ret = target_auxv_search (&current_target, AT_ENTRY, &entry_addr);
@@ -285,6 +465,11 @@
 +				"elf_locate_base: found program entry address 0x%s for %s\n",
 +				paddr_nz (entry_addr), exec_bfd->filename);
 +	}
++      reloc_addr = entry_addr - bfd_get_start_address (exec_bfd);
++      if (debug_solib)
++	fprintf_unfiltered (gdb_stdlog,
++			    "elf_locate_base: expected relocation offset 0x%s for %s\n",
++			    paddr_nz (reloc_addr), exec_bfd->filename);
 +    }
 +
    /* Find the start address of the .dynamic section.  */
@@ -331,53 +516,129 @@
  
    /* Iterate over BUF and scan for DYNTAG.  If found, set PTR and return.  */
    step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
-@@ -405,9 +466,43 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
- 	     CORE_ADDR ptr_addr;
- 
- 	     ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
-+	     if (ptr != NULL)
-+	       {
-+		 if (debug_solib)
-+		   fprintf_unfiltered (gdb_stdlog,
-+				       "elf_locate_base: unrelocated ptr addr 0x%s\n",
-+				       paddr_nz (ptr_addr));
-+		 ptr_addr += entry_addr - bfd_get_start_address (exec_bfd);
-+		 if (debug_solib) 
-+		   fprintf_unfiltered (gdb_stdlog, 
-+				       "elf_locate_base: relocated ptr addr 0x%s"
-+				       " (auxv entry 0x%s, bfd start address 0x%s)"
-+				       " for %s\n",
-+				       paddr_nz (ptr_addr), paddr_nz (entry_addr),
-+				       paddr_nz (bfd_get_start_address (exec_bfd)),
-+				       exec_bfd->filename);
-+	       }
- 	     if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
+@@ -393,25 +461,103 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
+ 	dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
+ 	dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
+       }
+-     if (dyn_tag == DT_NULL)
++
++    /* Verify RELOC_ADDR makes sense - it does not have to for valgrind which
++       supplies us a specially crafted executable in /proc/PID/fd/X while
++       /proc/PID/auxv corresponds to a different executable (.../memcheck).  */
++    if (reloc_addr)
++      {
++	gdb_byte tag_buf[8];
++	CORE_ADDR tag_addr;
++
++	tag_addr = dyn_addr + (buf - bufstart) + reloc_addr;
++	if (target_read_memory (tag_addr, tag_buf, arch_size / 8) == 0)
++	  {
++	    if (memcmp (tag_buf, buf, arch_size / 8) != 0)
++	      {
++		if (debug_solib)
++		  fprintf_unfiltered (gdb_stdlog,
++				      "elf_locate_base: tag at offset 0x%lx does not match,"
++				      " dropping relocation offset %s\n",
++				      (unsigned long) (buf - bufstart), paddr_nz (reloc_addr));
++		reloc_addr = 0;
++	      }
++	  }
++	else
++	  {
++	    if (debug_solib)
++	      fprintf_unfiltered (gdb_stdlog,
++				  "elf_locate_base: tag at offset 0x%lx is not readable,"
++				  " dropping relocation offset %s\n",
++				  (unsigned long) (buf - bufstart), paddr_nz (reloc_addr));
++	    reloc_addr = 0;
++	  }
++      }
++
++    if (dyn_tag == DT_NULL)
+        return 0;
+-     if (dyn_tag == dyntag)
+-       {
+-	 /* If requested, try to read the runtime value of this .dynamic
+-	    entry.  */
+-	 if (ptr)
+-	   {
+-	     gdb_byte ptr_buf[8];
+-	     CORE_ADDR ptr_addr;
+-
+-	     ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
+-	     if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
 -	       dyn_ptr = extract_typed_address (ptr_buf,
 -						builtin_type_void_data_ptr);
-+	       {
-+		 dyn_ptr = extract_typed_address (ptr_buf,
-+						  builtin_type_void_data_ptr);
-+		 if (ptr != NULL)
-+		   {
-+		     if (debug_solib)
-+		       fprintf_unfiltered (gdb_stdlog,
-+					   "elf_locate_base: Tag entry has value 0x%s -- return now\n",
-+					   paddr_nz (dyn_ptr));
-+		   }
-+	       }
-+	     else
-+	       {
-+		 if (ptr != NULL)
-+		   {
-+		     if (debug_solib)
-+		       fprintf_unfiltered (gdb_stdlog,
-+					   "elf_locate_base: Couldn't read tag entry value -- return now\n");
-+		   }
-+	       }
- 	     *ptr = dyn_ptr;
- 	   }
- 	 return 1;
-@@ -544,6 +639,10 @@ solib_svr4_r_map (void)
+-	     *ptr = dyn_ptr;
+-	   }
+-	 return 1;
+-       }
++    if (dyn_tag == dyntag)
++      {
++	/* If requested, try to read the runtime value of this .dynamic
++	   entry.  */
++	if (ptr)
++	  {
++	    gdb_byte ptr_buf[8];
++	    CORE_ADDR ptr_addr;
++	    int got;
++
++	    ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
++	    if (ptr != NULL)
++	      {
++		if (debug_solib)
++		  fprintf_unfiltered (gdb_stdlog,
++				      "elf_locate_base: unrelocated ptr addr 0x%s\n",
++				      paddr_nz (ptr_addr));
++		ptr_addr += reloc_addr;
++		if (debug_solib) 
++		  fprintf_unfiltered (gdb_stdlog, 
++				      "elf_locate_base: relocated ptr addr 0x%s"
++				      " (relocation offset %s) for %s\n",
++				      paddr_nz (ptr_addr), paddr_nz (reloc_addr),
++				      exec_bfd->filename);
++	      }
++	    got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8);
++	    if (got != 0 && reloc_addr)
++	      {
++		ptr_addr -= reloc_addr;
++		if (debug_solib) 
++		  fprintf_unfiltered (gdb_stdlog, 
++				      "elf_locate_base: unrelocated back to ptr addr 0x%s"
++				      " as the memory was unreable for %s\n",
++				      paddr_nz (ptr_addr), exec_bfd->filename);
++		got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8);
++	      }
++
++	    if (got == 0)
++	      {
++		dyn_ptr = extract_typed_address (ptr_buf,
++						 builtin_type_void_data_ptr);
++		if (ptr != NULL)
++		  {
++		    if (debug_solib)
++		      fprintf_unfiltered (gdb_stdlog,
++					  "elf_locate_base: Tag entry has value 0x%s -- return now\n",
++					  paddr_nz (dyn_ptr));
++		  }
++	      }
++	    else
++	      {
++		if (ptr != NULL)
++		  {
++		    if (debug_solib)
++		      fprintf_unfiltered (gdb_stdlog,
++					  "elf_locate_base: Couldn't read tag entry value -- return now\n");
++		  }
++	      }
++	    *ptr = dyn_ptr;
++	  }
++	return 1;
++      }
+   }
+ 
+   return 0;
+@@ -544,6 +690,10 @@ solib_svr4_r_map (void)
  {
    struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
  
@@ -388,7 +649,7 @@
    return read_memory_typed_address (debug_base + lmo->r_map_offset,
  				    builtin_type_void_data_ptr);
  }
-@@ -713,6 +812,11 @@ svr4_current_sos (void)
+@@ -713,6 +863,11 @@ svr4_current_sos (void)
    struct so_list *head = 0;
    struct so_list **link_ptr = &head;
    CORE_ADDR ldsomap = 0;
@@ -400,7 +661,7 @@
  
    /* Always locate the debug struct, in case it has moved.  */
    debug_base = 0;
-@@ -721,10 +825,19 @@ svr4_current_sos (void)
+@@ -721,10 +876,19 @@ svr4_current_sos (void)
    /* If we can't find the dynamic linker's base structure, this
       must not be a dynamically linked executable.  Hmm.  */
    if (! debug_base)
@@ -421,7 +682,7 @@
    lm = solib_svr4_r_map ();
  
    while (lm)
-@@ -740,23 +853,103 @@ svr4_current_sos (void)
+@@ -740,23 +904,103 @@ svr4_current_sos (void)
        new->lm_info->lm = xzalloc (lmo->link_map_size);
        make_cleanup (xfree, new->lm_info->lm);
  
@@ -527,7 +788,7 @@
  	  target_read_string (LM_NAME (new), &buffer,
  			      SO_NAME_MAX_PATH_SIZE - 1, &errcode);
  	  if (errcode != 0)
-@@ -764,47 +957,60 @@ svr4_current_sos (void)
+@@ -764,47 +1008,60 @@ svr4_current_sos (void)
  		     safe_strerror (errcode));
  	  else
  	    {
@@ -573,15 +834,15 @@
 +			}
 +		      else
 +			debug_print_missing (new->so_name, build_id_filename);
-+
-+		      xfree (build_id_filename);
-+		      xfree (build_id);
-+		    }
  
 -		  /* Missing the build-id matching separate debug info file
 -		     would be handled while SO_NAME gets loaded.  */
 -		  name = build_id_to_filename (build_id, &build_id_filename, 0);
 -		  if (name != NULL)
++		      xfree (build_id_filename);
++		      xfree (build_id);
++		    }
++
 +		  if (debug_solib)
  		    {
 -		      strncpy (new->so_name, name, SO_NAME_MAX_PATH_SIZE - 1);
@@ -621,7 +882,7 @@
  	}
  
        /* On Solaris, the dynamic linker is not in the normal list of
-@@ -820,6 +1026,9 @@ svr4_current_sos (void)
+@@ -820,6 +1077,9 @@ svr4_current_sos (void)
    if (head == NULL)
      return svr4_default_sos ();
  
@@ -631,7 +892,7 @@
    return head;
  }
  
-@@ -921,7 +1130,7 @@ for (resolve = 0; resolve <= 1; resolve+
+@@ -921,7 +1181,7 @@ for (resolve = 0; resolve <= 1; resolve+
  /* On some systems, the only way to recognize the link map entry for
     the main executable file is by looking at its name.  Return
     non-zero iff SONAME matches one of the known main executable names.  */
@@ -640,7 +901,7 @@
  static int
  match_main (char *soname)
  {
-@@ -935,6 +1144,7 @@ match_main (char *soname)
+@@ -935,6 +1195,7 @@ match_main (char *soname)
  
    return (0);
  }
@@ -648,7 +909,7 @@
  
  /* Return 1 if PC lies in the dynamic symbol resolution code of the
     SVR4 run time loader.  */
-@@ -1086,11 +1296,17 @@ enable_break (void)
+@@ -1086,11 +1347,17 @@ enable_break (void)
    /* Find the .interp section; if not found, warn the user and drop
       into the old breakpoint at symbol code.  */
    interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
@@ -666,7 +927,7 @@
        int load_addr_found = 0;
        int loader_found_in_list = 0;
        struct so_list *so;
-@@ -1098,6 +1314,14 @@ enable_break (void)
+@@ -1098,6 +1365,14 @@ enable_break (void)
        struct target_ops *tmp_bfd_target;
        int tmp_fd = -1;
        char *tmp_pathname = NULL;
@@ -681,7 +942,7 @@
  
        /* Read the contents of the .interp section into a local buffer;
           the contents specify the dynamic linker this program uses.  */
-@@ -1120,6 +1344,9 @@ enable_break (void)
+@@ -1120,6 +1395,9 @@ enable_break (void)
        if (tmp_fd >= 0)
  	tmp_bfd = bfd_fopen (tmp_pathname, gnutarget, FOPEN_RB, tmp_fd);
  
@@ -691,7 +952,7 @@
        if (tmp_bfd == NULL)
  	goto bkpt_at_symbol;
  
-@@ -1181,16 +1408,16 @@ enable_break (void)
+@@ -1181,16 +1459,16 @@ enable_break (void)
        interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
        if (interp_sect)
  	{
@@ -712,7 +973,7 @@
  	  interp_plt_sect_high =
  	    interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
  	}
-@@ -1225,7 +1452,11 @@ enable_break (void)
+@@ -1225,7 +1503,11 @@ enable_break (void)
  
        if (sym_addr != 0)
  	{
@@ -725,7 +986,7 @@
  	  return 1;
  	}
  
-@@ -1486,6 +1717,8 @@ svr4_solib_create_inferior_hook (void)
+@@ -1486,6 +1768,8 @@ svr4_solib_create_inferior_hook (void)
    while (stop_signal != TARGET_SIGNAL_TRAP);
    stop_soon = NO_STOP_QUIETLY;
  #endif /* defined(_SCO_DS) */
@@ -734,7 +995,7 @@
  }
  
  static void
-@@ -1666,6 +1899,75 @@ svr4_lp64_fetch_link_map_offsets (void)
+@@ -1666,6 +1950,75 @@ svr4_lp64_fetch_link_map_offsets (void)
  
    return lmp;
  }
@@ -810,7 +1071,7 @@
  
  
  struct target_so_ops svr4_so_ops;
-@@ -1724,4 +2026,7 @@ _initialize_svr4_solib (void)
+@@ -1724,4 +2077,7 @@ _initialize_svr4_solib (void)
    svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code;
    svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol;
    svr4_so_ops.same = svr4_same;
@@ -818,293 +1079,9 @@
 +  add_info ("linkmap", info_linkmap_command,
 +	    "Display the inferior's linkmap.");
  }
-Index: gdb-6.8/gdb/varobj.c
-===================================================================
---- gdb-6.8.orig/gdb/varobj.c	2008-04-19 21:38:27.000000000 +0200
-+++ gdb-6.8/gdb/varobj.c	2008-04-19 21:38:33.000000000 +0200
-@@ -1075,6 +1075,62 @@ install_new_value (struct varobj *var, s
-   return changed;
- }
- 
-+void
-+varobj_refresh (void)
-+{
-+  struct varobj *var;
-+  struct varobj_root *croot;
-+  int mycount = rootcount;
-+  char * name;
-+
-+  croot = rootlist;
-+  while ((croot != NULL) && (mycount > 0))
-+    {
-+      var = croot->rootvar;
-+
-+      /* Get rid of the memory for the old expression.  This also
-+         leaves var->root->exp == NULL, which is ok for the parsing
-+         below.  */
-+      free_current_contents (&var->root->exp);
-+
-+      value_free (var->value);
-+      var->type = NULL;
-+
-+      name = xstrdup (var->name);
-+
-+      /* Reparse the expression.  Wrap the call to parse expression,
-+         so we can return a sensible error. */
-+      if (!gdb_parse_exp_1 (&name, var->root->valid_block, 0, &var->root->exp))
-+        {
-+          return;
-+        }
-+
-+      /* We definitively need to catch errors here.
-+         If evaluate_expression succeeds we got the value we wanted.
-+         But if it fails, we still go on with a call to evaluate_type()  */
-+      if (gdb_evaluate_expression (var->root->exp, &var->value))
-+        {
-+          /* no error */
-+          release_value (var->value);
-+          if (value_lazy (var->value))
-+            gdb_value_fetch_lazy (var->value);
-+        }
-+      else
-+        var->value = evaluate_type (var->root->exp);
-+
-+      var->type = value_type (var->value);
-+
-+      mycount--;
-+      croot = croot->next;
-+    }
-+
-+  if (mycount || (croot != NULL))
-+    warning
-+      ("varobj_refresh: assertion failed - wrong tally of root vars (%d:%d)",
-+       rootcount, mycount);
-+}
-+
-+
- /* Update the values for a variable and its children.  This is a
-    two-pronged attack.  First, re-parse the value for the root's
-    expression to see if it's changed.  Then go all the way
-Index: gdb-6.8/gdb/solist.h
-===================================================================
---- gdb-6.8.orig/gdb/solist.h	2008-01-07 16:19:58.000000000 +0100
-+++ gdb-6.8/gdb/solist.h	2008-04-19 21:38:33.000000000 +0200
-@@ -61,6 +61,8 @@ struct so_list
-     bfd *abfd;
-     char symbols_loaded;	/* flag: symbols read in yet? */
-     char from_tty;		/* flag: print msgs? */
-+    char main;                  /* flag: is this the main executable? */
-+    char main_relocated;        /* flag: has it been relocated yet? */
-     struct objfile *objfile;	/* objfile for loaded lib */
-     struct section_table *sections;
-     struct section_table *sections_end;
-@@ -127,9 +129,15 @@ void free_so (struct so_list *so);
- /* Return address of first so_list entry in master shared object list.  */
- struct so_list *master_so_list (void);
- 
-+/* Return address of first so_list entry in master shared object list.  */
-+struct so_list *master_so_list (void);
-+
- /* Find solib binary file and open it.  */
- extern int solib_open (char *in_pathname, char **found_pathname);
- 
-+/* Add the list of sections in so_list to the target to_sections.  */
-+extern void add_to_target_sections (int, struct target_ops *, struct so_list *);
-+
- /* FIXME: gdbarch needs to control this variable */
- extern struct target_so_ops *current_target_so_ops;
- 
-@@ -140,4 +148,6 @@ struct symbol *solib_global_lookup (cons
- 				    const domain_enum domain,
- 				    struct symtab **symtab);
- 
-+/* Controls the printing of debugging output.  */
-+extern int debug_solib;
- #endif
-Index: gdb-6.8/gdb/varobj.h
-===================================================================
---- gdb-6.8.orig/gdb/varobj.h	2008-01-30 08:17:31.000000000 +0100
-+++ gdb-6.8/gdb/varobj.h	2008-04-19 21:38:33.000000000 +0200
-@@ -122,4 +122,6 @@ extern void varobj_invalidate (void);
- 
- extern int varobj_editable_p (struct varobj *var);
- 
-+extern void varobj_refresh(void);
-+
- #endif /* VAROBJ_H */
-Index: gdb-6.8/gdb/symfile.c
-===================================================================
---- gdb-6.8.orig/gdb/symfile.c	2008-04-19 21:38:32.000000000 +0200
-+++ gdb-6.8/gdb/symfile.c	2008-04-19 21:38:33.000000000 +0200
-@@ -47,6 +47,7 @@
- #include "readline/readline.h"
- #include "gdb_assert.h"
- #include "block.h"
-+#include "varobj.h"
- #include "observer.h"
- #include "exec.h"
- #include "parser-defs.h"
-@@ -815,7 +816,7 @@ syms_from_objfile (struct objfile *objfi
- 
-   /* Now either addrs or offsets is non-zero.  */
- 
--  if (mainline)
-+  if (mainline == 1)
-     {
-       /* We will modify the main symbol table, make sure that all its users
-          will be cleaned up if an error occurs during symbol reading.  */
-@@ -843,7 +844,7 @@ syms_from_objfile (struct objfile *objfi
- 
-      We no longer warn if the lowest section is not a text segment (as
-      happens for the PA64 port.  */
--  if (!mainline && addrs && addrs->other[0].name)
-+  if (/*!mainline &&*/ addrs && addrs->other[0].name)
-     {
-       asection *sect;
-       CORE_ADDR lower_offset = 0;	/* Shut up the GCC warning.  */
-@@ -1002,17 +1003,21 @@ new_symfile_objfile (struct objfile *obj
-   /* If this is the main symbol file we have to clean up all users of the
-      old main symbol file. Otherwise it is sufficient to fixup all the
-      breakpoints that may have been redefined by this symbol file.  */
--  if (mainline)
-+  if (mainline == 1)
-     {
-       /* OK, make it the "real" symbol file.  */
-       symfile_objfile = objfile;
- 
-       clear_symtab_users ();
-     }
--  else
-+  else if (mainline == 0)
-     {
-       breakpoint_re_set ();
-     }
-+  else
-+    {
-+      /* Don't reset breakpoints or it will screw up PIE.  */
-+    }
- 
-   /* We're done reading the symbol file; finish off complaints.  */
-   clear_complaints (&symfile_complaints, 0, verbo);
-@@ -1055,7 +1060,7 @@ symbol_file_add_with_addrs_or_offsets (b
-      interactively wiping out any existing symbols.  */
- 
-   if ((have_full_symbols () || have_partial_symbols ())
--      && mainline
-+      && (mainline == 1)
-       && from_tty
-       && !query ("Load new symbol table from \"%s\"? ", name))
-     error (_("Not confirmed."));
-@@ -1241,6 +1246,10 @@ symbol_file_clear (int from_tty)
- 		    symfile_objfile->name)
- 	  : !query (_("Discard symbol table? "))))
-     error (_("Not confirmed."));
-+#ifdef CLEAR_SOLIB
-+      CLEAR_SOLIB ();
-+#endif
-+
-     free_all_objfiles ();
- 
-     /* solib descriptors may have handles to objfiles.  Since their
-@@ -3330,6 +3339,8 @@ reread_symbols (void)
- 	      /* Discard cleanups as symbol reading was successful.  */
- 	      discard_cleanups (old_cleanups);
- 
-+	      init_entry_point_info (objfile);
-+
- 	      /* If the mtime has changed between the time we set new_modtime
- 	         and now, we *want* this to be out of date, so don't call stat
- 	         again now.  */
-@@ -3698,6 +3709,7 @@ clear_symtab_users (void)
-   breakpoint_re_set ();
-   set_default_breakpoint (0, 0, 0, 0);
-   clear_pc_function_cache ();
-+  varobj_refresh ();
-   observer_notify_new_objfile (NULL);
- 
-   /* Clear globals which might have pointed into a removed objfile.
-Index: gdb-6.8/gdb/breakpoint.c
-===================================================================
---- gdb-6.8.orig/gdb/breakpoint.c	2008-04-19 21:38:33.000000000 +0200
-+++ gdb-6.8/gdb/breakpoint.c	2008-04-19 21:38:33.000000000 +0200
-@@ -3946,7 +3946,8 @@ describe_other_breakpoints (CORE_ADDR pc
- 	      printf_filtered (" (thread %d)", b->thread);
- 	    printf_filtered ("%s%s ",
- 			     ((b->enable_state == bp_disabled || 
--			       b->enable_state == bp_call_disabled) 
-+			       b->enable_state == bp_call_disabled ||
-+			       b->enable_state == bp_startup_disabled)
- 			      ? " (disabled)"
- 			      : b->enable_state == bp_permanent 
- 			      ? " (permanent)"
-@@ -4598,6 +4599,62 @@ disable_breakpoints_in_unloaded_shlib (s
-   }
- }
- 
-+void
-+disable_breakpoints_at_startup (int silent)
-+{
-+  struct breakpoint *b;
-+  int disabled_startup_breaks = 0;
-+
-+  if (bfd_get_start_address (exec_bfd) != entry_point_address ())
-+    {
-+      ALL_BREAKPOINTS (b)
-+	{
-+	  if (((b->type == bp_breakpoint) ||
-+	       (b->type == bp_hardware_breakpoint)) &&
-+	      b->enable_state == bp_enabled &&
-+	      !b->loc->duplicate)
-+	    {
-+	      b->enable_state = bp_startup_disabled;
-+	      if (!silent)
-+		{
-+		  if (!disabled_startup_breaks)
-+		    {
-+		      target_terminal_ours_for_output ();
-+		      warning ("Temporarily disabling breakpoints:");
-+		    }
-+		  disabled_startup_breaks = 1;
-+		  warning ("breakpoint #%d addr 0x%s", b->number, paddr_nz(b->loc->address));
-+		}
-+	    }
-+	}
-+    }
-+}
-+
-+/* Try to reenable any breakpoints after startup.  */
-+void
-+re_enable_breakpoints_at_startup (void)
-+{
-+  struct breakpoint *b;
-+
-+  if (bfd_get_start_address (exec_bfd) != entry_point_address ())
-+    {
-+      ALL_BREAKPOINTS (b)
-+	if (b->enable_state == bp_startup_disabled)
-+	  {
-+	    char buf[1];
-+
-+	    /* Do not reenable the breakpoint if the shared library
-+	       is still not mapped in.  */
-+	    if (target_read_memory (b->loc->address, buf, 1) == 0)
-+	      {
-+		/*printf ("enabling breakpoint at 0x%s\n", paddr_nz(b->loc->address));*/
-+		b->enable_state = bp_enabled;
-+	      }
-+	  }
-+    }
-+}
-+
-+
- static void
- create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
- 				    enum bptype bp_kind)
-Index: gdb-6.8/gdb/solib.c
-===================================================================
---- gdb-6.8.orig/gdb/solib.c	2008-01-07 16:19:58.000000000 +0100
-+++ gdb-6.8/gdb/solib.c	2008-04-19 21:38:33.000000000 +0200
-@@ -79,6 +79,8 @@ set_solib_ops (struct gdbarch *gdbarch, 
+--- ./gdb/solib.c	2008-01-07 16:19:58.000000000 +0100
++++ ./gdb/solib.c	2008-09-01 17:16:12.000000000 +0200
+@@ -79,6 +79,8 @@ set_solib_ops (struct gdbarch *gdbarch, 
  
  /* external data declarations */
  
@@ -1278,135 +1255,211 @@
 +			   NULL, NULL,
 +			   &setdebuglist, &showdebuglist);
  }
-Index: gdb-6.8/gdb/elfread.c
-===================================================================
---- gdb-6.8.orig/gdb/elfread.c	2008-01-01 23:53:09.000000000 +0100
-+++ gdb-6.8/gdb/elfread.c	2008-04-19 21:38:33.000000000 +0200
-@@ -644,7 +644,7 @@ elf_symfile_read (struct objfile *objfil
-   /* If we are reinitializing, or if we have never loaded syms yet,
-      set table to empty.  MAINLINE is cleared so that *_read_psymtab
-      functions do not all also re-initialize the psymbol table. */
+--- ./gdb/solist.h	2008-01-07 16:19:58.000000000 +0100
++++ ./gdb/solist.h	2008-08-30 23:40:33.000000000 +0200
+@@ -61,6 +61,8 @@ struct so_list
+     bfd *abfd;
+     char symbols_loaded;	/* flag: symbols read in yet? */
+     char from_tty;		/* flag: print msgs? */
++    char main;                  /* flag: is this the main executable? */
++    char main_relocated;        /* flag: has it been relocated yet? */
+     struct objfile *objfile;	/* objfile for loaded lib */
+     struct section_table *sections;
+     struct section_table *sections_end;
+@@ -127,9 +129,15 @@ void free_so (struct so_list *so);
+ /* Return address of first so_list entry in master shared object list.  */
+ struct so_list *master_so_list (void);
+ 
++/* Return address of first so_list entry in master shared object list.  */
++struct so_list *master_so_list (void);
++
+ /* Find solib binary file and open it.  */
+ extern int solib_open (char *in_pathname, char **found_pathname);
+ 
++/* Add the list of sections in so_list to the target to_sections.  */
++extern void add_to_target_sections (int, struct target_ops *, struct so_list *);
++
+ /* FIXME: gdbarch needs to control this variable */
+ extern struct target_so_ops *current_target_so_ops;
+ 
+@@ -140,4 +148,6 @@ struct symbol *solib_global_lookup (cons
+ 				    const domain_enum domain,
+ 				    struct symtab **symtab);
+ 
++/* Controls the printing of debugging output.  */
++extern int debug_solib;
+ #endif
+--- ./gdb/symfile-mem.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/symfile-mem.c	2008-08-30 23:40:33.000000000 +0200
+@@ -116,7 +116,7 @@ symbol_file_add_from_memory (struct bfd 
+       }
+ 
+   objf = symbol_file_add_from_bfd (nbfd, from_tty,
+-                                   sai, 0, OBJF_SHARED);
++                                   sai, 2, OBJF_SHARED);
+ 
+   /* This might change our ideas about frames already looked at.  */
+   reinit_frame_cache ();
+--- ./gdb/symfile.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/symfile.c	2008-08-30 23:41:48.000000000 +0200
+@@ -47,6 +47,7 @@
+ #include "readline/readline.h"
+ #include "gdb_assert.h"
+ #include "block.h"
++#include "varobj.h"
+ #include "observer.h"
+ #include "exec.h"
+ #include "parser-defs.h"
+@@ -815,7 +816,7 @@ syms_from_objfile (struct objfile *objfi
+ 
+   /* Now either addrs or offsets is non-zero.  */
+ 
 -  if (mainline)
 +  if (mainline == 1)
      {
-       init_psymbol_list (objfile, 0);
-       mainline = 0;
-Index: gdb-6.8/gdb/Makefile.in
-===================================================================
---- gdb-6.8.orig/gdb/Makefile.in	2008-04-19 21:38:32.000000000 +0200
-+++ gdb-6.8/gdb/Makefile.in	2008-04-19 21:38:33.000000000 +0200
-@@ -1920,7 +1920,7 @@ amd64-tdep.o: amd64-tdep.c $(defs_h) $(a
- 	$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
- 	$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
- 	$(regset_h) $(symfile_h) $(gdb_assert_h) $(amd64_tdep_h) \
--	$(i387_tdep_h)
-+	$(i387_tdep_h) $(exceptions_h)
- annotate.o: annotate.c $(defs_h) $(annotate_h) $(value_h) $(target_h) \
- 	$(gdbtypes_h) $(breakpoint_h)
- arch-utils.o: arch-utils.c $(defs_h) $(arch_utils_h) $(buildsym_h) \
-Index: gdb-6.8/gdb/amd64-tdep.c
-===================================================================
---- gdb-6.8.orig/gdb/amd64-tdep.c	2008-04-19 21:38:28.000000000 +0200
-+++ gdb-6.8/gdb/amd64-tdep.c	2008-04-19 21:38:33.000000000 +0200
-@@ -36,6 +36,7 @@
- #include "symfile.h"
- #include "dwarf2-frame.h"
- #include "gdb_assert.h"
-+#include "exceptions.h"
- 
- #include "amd64-tdep.h"
- #include "i387-tdep.h"
-@@ -731,16 +732,28 @@ amd64_alloc_frame_cache (void)
-    Any function that doesn't start with this sequence will be assumed
-    to have no prologue and thus no valid frame pointer in %rbp.  */
+       /* We will modify the main symbol table, make sure that all its users
+          will be cleaned up if an error occurs during symbol reading.  */
+@@ -843,7 +844,7 @@ syms_from_objfile (struct objfile *objfi
  
--static CORE_ADDR
--amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
--			struct amd64_frame_cache *cache)
-+struct amd64_analyze_prologue_data
-+  {
-+    CORE_ADDR pc, current_pc;
-+    struct amd64_frame_cache *cache;
-+    CORE_ADDR retval;
-+  };
-+
-+static int
-+amd64_analyze_prologue_1 (void *data_pointer)
- {
-+  struct amd64_analyze_prologue_data *data = data_pointer;
-+  CORE_ADDR pc = data->pc, current_pc = data->current_pc;
-+  struct amd64_frame_cache *cache = data->cache;
-   static gdb_byte proto[3] = { 0x48, 0x89, 0xe5 }; /* movq %rsp, %rbp */
-   gdb_byte buf[3];
-   gdb_byte op;
+      We no longer warn if the lowest section is not a text segment (as
+      happens for the PA64 port.  */
+-  if (!mainline && addrs && addrs->other[0].name)
++  if (/*!mainline &&*/ addrs && addrs->other[0].name)
+     {
+       asection *sect;
+       CORE_ADDR lower_offset = 0;	/* Shut up the GCC warning.  */
+@@ -1002,17 +1003,21 @@ new_symfile_objfile (struct objfile *obj
+   /* If this is the main symbol file we have to clean up all users of the
+      old main symbol file. Otherwise it is sufficient to fixup all the
+      breakpoints that may have been redefined by this symbol file.  */
+-  if (mainline)
++  if (mainline == 1)
+     {
+       /* OK, make it the "real" symbol file.  */
+       symfile_objfile = objfile;
  
-   if (current_pc <= pc)
--    return current_pc;
+       clear_symtab_users ();
+     }
+-  else
++  else if (mainline == 0)
+     {
+       breakpoint_re_set ();
+     }
++  else
 +    {
-+      data->retval = current_pc;
-+      return 1;
++      /* Don't reset breakpoints or it will screw up PIE.  */
 +    }
  
-   op = read_memory_unsigned_integer (pc, 1);
+   /* We're done reading the symbol file; finish off complaints.  */
+   clear_complaints (&symfile_complaints, 0, verbo);
+@@ -1055,7 +1060,7 @@ symbol_file_add_with_addrs_or_offsets (b
+      interactively wiping out any existing symbols.  */
  
-@@ -753,18 +766,57 @@ amd64_analyze_prologue (CORE_ADDR pc, CO
+   if ((have_full_symbols () || have_partial_symbols ())
+-      && mainline
++      && (mainline == 1)
+       && from_tty
+       && !query ("Load new symbol table from \"%s\"? ", name))
+     error (_("Not confirmed."));
+@@ -1242,6 +1247,10 @@ symbol_file_clear (int from_tty)
+ 		    symfile_objfile->name)
+ 	  : !query (_("Discard symbol table? "))))
+     error (_("Not confirmed."));
++#ifdef CLEAR_SOLIB
++      CLEAR_SOLIB ();
++#endif
++
+     free_all_objfiles ();
  
-       /* If that's all, return now.  */
-       if (current_pc <= pc + 1)
--        return current_pc;
-+        {
-+	  data->retval = current_pc;
-+	  return 1;
-+        }
+     /* solib descriptors may have handles to objfiles.  Since their
+@@ -3335,6 +3344,8 @@ reread_symbols (void)
+ 	      /* Discard cleanups as symbol reading was successful.  */
+ 	      discard_cleanups (old_cleanups);
  
-       /* Check for `movq %rsp, %rbp'.  */
-       read_memory (pc + 1, buf, 3);
-       if (memcmp (buf, proto, 3) != 0)
--	return pc + 1;
-+	{
-+	  data->retval = pc + 1;
-+	  return 1;
-+	}
++	      init_entry_point_info (objfile);
++
+ 	      /* If the mtime has changed between the time we set new_modtime
+ 	         and now, we *want* this to be out of date, so don't call stat
+ 	         again now.  */
+@@ -3703,6 +3714,7 @@ clear_symtab_users (void)
+   breakpoint_re_set ();
+   set_default_breakpoint (0, 0, 0, 0);
+   clear_pc_function_cache ();
++  varobj_refresh ();
+   observer_notify_new_objfile (NULL);
  
-       /* OK, we actually have a frame.  */
-       cache->frameless_p = 0;
--      return pc + 4;
-+      data->retval = pc + 4;
-+      return 1;
-     }
+   /* Clear globals which might have pointed into a removed objfile.
+--- ./gdb/varobj.c	2008-09-01 17:16:38.000000000 +0200
++++ ./gdb/varobj.c	2008-08-30 23:40:33.000000000 +0200
+@@ -1075,6 +1075,62 @@ install_new_value (struct varobj *var, s
+   return changed;
+ }
  
-+  data->retval = pc;
-+  return 1;
-+}
++void
++varobj_refresh (void)
++{
++  struct varobj *var;
++  struct varobj_root *croot;
++  int mycount = rootcount;
++  char * name;
 +
-+/* Catch memory read errors and return just PC in such case.
-+   It occurs very early on enable_break->new_symfile_objfile->
-+   ->breakpoint_re_set->decode_line_1->decode_variable_1->
-+   ->find_function_start_sal  */
++  croot = rootlist;
++  while ((croot != NULL) && (mycount > 0))
++    {
++      var = croot->rootvar;
 +
-+static CORE_ADDR
-+amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
-+			struct amd64_frame_cache *cache)
-+{
-+  int status;
-+  struct amd64_analyze_prologue_data data;
-+  struct ui_file *saved_gdb_stderr;
++      /* Get rid of the memory for the old expression.  This also
++         leaves var->root->exp == NULL, which is ok for the parsing
++         below.  */
++      free_current_contents (&var->root->exp);
 +
-+  /* Suppress error messages.  */
-+  saved_gdb_stderr = gdb_stderr;
-+  gdb_stderr = ui_file_new ();
++      value_free (var->value);
++      var->type = NULL;
 +
-+  data.pc = pc;
-+  data.current_pc = current_pc;
-+  data.cache = cache;
-+  status = catch_errors (amd64_analyze_prologue_1, &data, "", RETURN_MASK_ALL);
++      name = xstrdup (var->name);
 +
-+  /* Stop suppressing error messages.  */
-+  ui_file_delete (gdb_stderr);
-+  gdb_stderr = saved_gdb_stderr;
++      /* Reparse the expression.  Wrap the call to parse expression,
++         so we can return a sensible error. */
++      if (!gdb_parse_exp_1 (&name, var->root->valid_block, 0, &var->root->exp))
++        {
++          return;
++        }
 +
-+  if (status)
-+    return data.retval;
-   return pc;
- }
++      /* We definitively need to catch errors here.
++         If evaluate_expression succeeds we got the value we wanted.
++         But if it fails, we still go on with a call to evaluate_type()  */
++      if (gdb_evaluate_expression (var->root->exp, &var->value))
++        {
++          /* no error */
++          release_value (var->value);
++          if (value_lazy (var->value))
++            gdb_value_fetch_lazy (var->value);
++        }
++      else
++        var->value = evaluate_type (var->root->exp);
++
++      var->type = value_type (var->value);
++
++      mycount--;
++      croot = croot->next;
++    }
++
++  if (mycount || (croot != NULL))
++    warning
++      ("varobj_refresh: assertion failed - wrong tally of root vars (%d:%d)",
++       rootcount, mycount);
++}
++
++
+ /* Update the values for a variable and its children.  This is a
+    two-pronged attack.  First, re-parse the value for the root's
+    expression to see if it's changed.  Then go all the way
+--- ./gdb/varobj.h	2008-01-30 08:17:31.000000000 +0100
++++ ./gdb/varobj.h	2008-08-30 23:40:33.000000000 +0200
+@@ -122,4 +122,6 @@ extern void varobj_invalidate (void);
+ 
+ extern int varobj_editable_p (struct varobj *var);
  
++extern void varobj_refresh(void);
++
+ #endif /* VAROBJ_H */


Index: gdb.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/F-9/gdb.spec,v
retrieving revision 1.296
retrieving revision 1.297
diff -u -r1.296 -r1.297
--- gdb.spec	28 Aug 2008 14:37:01 -0000	1.296
+++ gdb.spec	2 Sep 2008 00:31:01 -0000	1.297
@@ -16,7 +16,7 @@
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 21%{?_with_upstream:.upstream}%{?dist}
+Release: 22%{?_with_upstream:.upstream}%{?dist}
 
 License: GPLv3+
 Group: Development/Debuggers
@@ -838,6 +838,9 @@
 %endif
 
 %changelog
+* Tue Sep  2 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-22
+- Fix PIE patch regression for loading binaries from valgrind (BZ 460319).
+
 * Thu Aug 28 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-21
 - Fix attaching to stopped processes, based on the upstream version now.
   - Just kernel-2.6.25 neither upstream nor utrace work with it; 2.6.9 works.




More information about the fedora-extras-commits mailing list