Blame SOURCES/gdb-dlopen-stap-probe-3of9.patch

2c2fa1
http://sourceware.org/ml/gdb-cvs/2013-06/msg00014.html
2c2fa1
2c2fa1
### src/gdb/gdbserver/ChangeLog	2013/05/31 19:14:33	1.720
2c2fa1
### src/gdb/gdbserver/ChangeLog	2013/06/04 12:59:20	1.721
2c2fa1
## -1,3 +1,12 @@
2c2fa1
+2013-06-04  Gary Benson  <gbenson@redhat.com>
2c2fa1
+
2c2fa1
+	* server.c (handle_query): Add "augmented-libraries-svr4-read+"
2c2fa1
+	to qSupported response when appropriate.
2c2fa1
+	(handle_qxfer_libraries_svr4): Allow qXfer:libraries-svr4:read
2c2fa1
+	with nonzero-length annex.
2c2fa1
+	* linux-low.c (linux_qxfer_libraries_svr4): Parse and handle
2c2fa1
+	arguments supplied in annex.
2c2fa1
+
2c2fa1
 2013-05-31  Doug Evans  <dje@google.com>
2c2fa1
 
2c2fa1
 	* linux-x86-low.c (ps_get_thread_area): Properly extend address to
2c2fa1
--- src/gdb/gdbserver/linux-low.c	2013/05/23 17:17:50	1.237
2c2fa1
+++ src/gdb/gdbserver/linux-low.c	2013/06/04 12:59:21	1.238
2c2fa1
@@ -5728,6 +5728,12 @@
2c2fa1
     };
2c2fa1
   const struct link_map_offsets *lmo;
2c2fa1
   unsigned int machine;
2c2fa1
+  int ptr_size;
2c2fa1
+  CORE_ADDR lm_addr = 0, lm_prev = 0;
2c2fa1
+  int allocated = 1024;
2c2fa1
+  char *p;
2c2fa1
+  CORE_ADDR l_name, l_addr, l_ld, l_next, l_prev;
2c2fa1
+  int header_done = 0;
2c2fa1
 
2c2fa1
   if (writebuf != NULL)
2c2fa1
     return -2;
2c2fa1
@@ -5738,128 +5744,144 @@
2c2fa1
   xsnprintf (filename, sizeof filename, "/proc/%d/exe", pid);
2c2fa1
   is_elf64 = elf_64_file_p (filename, &machine);
2c2fa1
   lmo = is_elf64 ? &lmo_64bit_offsets : &lmo_32bit_offsets;
2c2fa1
+  ptr_size = is_elf64 ? 8 : 4;
2c2fa1
 
2c2fa1
-  if (priv->r_debug == 0)
2c2fa1
-    priv->r_debug = get_r_debug (pid, is_elf64);
2c2fa1
-
2c2fa1
-  /* We failed to find DT_DEBUG.  Such situation will not change for this
2c2fa1
-     inferior - do not retry it.  Report it to GDB as E01, see for the reasons
2c2fa1
-     at the GDB solib-svr4.c side.  */
2c2fa1
-  if (priv->r_debug == (CORE_ADDR) -1)
2c2fa1
-    return -1;
2c2fa1
-
2c2fa1
-  if (priv->r_debug == 0)
2c2fa1
+  while (annex[0] != '\0')
2c2fa1
     {
2c2fa1
-      document = xstrdup ("<library-list-svr4 version=\"1.0\"/>\n");
2c2fa1
+      const char *sep;
2c2fa1
+      CORE_ADDR *addrp;
2c2fa1
+      int len;
2c2fa1
+
2c2fa1
+      sep = strchr (annex, '=');
2c2fa1
+      if (sep == NULL)
2c2fa1
+	break;
2c2fa1
+
2c2fa1
+      len = sep - annex;
2c2fa1
+      if (len == 5 && strncmp (annex, "start", 5) == 0)
2c2fa1
+	addrp = &lm_addr;
2c2fa1
+      else if (len == 4 && strncmp (annex, "prev", 4) == 0)
2c2fa1
+	addrp = &lm_prev;
2c2fa1
+      else
2c2fa1
+	{
2c2fa1
+	  annex = strchr (sep, ';');
2c2fa1
+	  if (annex == NULL)
2c2fa1
+	    break;
2c2fa1
+	  annex++;
2c2fa1
+	  continue;
2c2fa1
+	}
2c2fa1
+
2c2fa1
+      annex = decode_address_to_semicolon (addrp, sep + 1);
2c2fa1
     }
2c2fa1
-  else
2c2fa1
+
2c2fa1
+  if (lm_addr == 0)
2c2fa1
     {
2c2fa1
-      int allocated = 1024;
2c2fa1
-      char *p;
2c2fa1
-      const int ptr_size = is_elf64 ? 8 : 4;
2c2fa1
-      CORE_ADDR lm_addr, lm_prev, l_name, l_addr, l_ld, l_next, l_prev;
2c2fa1
-      int r_version, header_done = 0;
2c2fa1
-
2c2fa1
-      document = xmalloc (allocated);
2c2fa1
-      strcpy (document, "
2c2fa1
-      p = document + strlen (document);
2c2fa1
-
2c2fa1
-      r_version = 0;
2c2fa1
-      if (linux_read_memory (priv->r_debug + lmo->r_version_offset,
2c2fa1
-			     (unsigned char *) &r_version,
2c2fa1
-			     sizeof (r_version)) != 0
2c2fa1
-	  || r_version != 1)
2c2fa1
+      int r_version = 0;
2c2fa1
+
2c2fa1
+      if (priv->r_debug == 0)
2c2fa1
+	priv->r_debug = get_r_debug (pid, is_elf64);
2c2fa1
+
2c2fa1
+      /* We failed to find DT_DEBUG.  Such situation will not change
2c2fa1
+	 for this inferior - do not retry it.  Report it to GDB as
2c2fa1
+	 E01, see for the reasons at the GDB solib-svr4.c side.  */
2c2fa1
+      if (priv->r_debug == (CORE_ADDR) -1)
2c2fa1
+	return -1;
2c2fa1
+
2c2fa1
+      if (priv->r_debug != 0)
2c2fa1
 	{
2c2fa1
-	  warning ("unexpected r_debug version %d", r_version);
2c2fa1
-	  goto done;
2c2fa1
+	  if (linux_read_memory (priv->r_debug + lmo->r_version_offset,
2c2fa1
+				 (unsigned char *) &r_version,
2c2fa1
+				 sizeof (r_version)) != 0
2c2fa1
+	      || r_version != 1)
2c2fa1
+	    {
2c2fa1
+	      warning ("unexpected r_debug version %d", r_version);
2c2fa1
+	    }
2c2fa1
+	  else if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
2c2fa1
+				 &lm_addr, ptr_size) != 0)
2c2fa1
+	    {
2c2fa1
+	      warning ("unable to read r_map from 0x%lx",
2c2fa1
+		       (long) priv->r_debug + lmo->r_map_offset);
2c2fa1
+	    }
2c2fa1
 	}
2c2fa1
+    }
2c2fa1
+
2c2fa1
+  document = xmalloc (allocated);
2c2fa1
+  strcpy (document, "
2c2fa1
+  p = document + strlen (document);
2c2fa1
+
2c2fa1
+  while (lm_addr
2c2fa1
+	 && read_one_ptr (lm_addr + lmo->l_name_offset,
2c2fa1
+			  &l_name, ptr_size) == 0
2c2fa1
+	 && read_one_ptr (lm_addr + lmo->l_addr_offset,
2c2fa1
+			  &l_addr, ptr_size) == 0
2c2fa1
+	 && read_one_ptr (lm_addr + lmo->l_ld_offset,
2c2fa1
+			  &l_ld, ptr_size) == 0
2c2fa1
+	 && read_one_ptr (lm_addr + lmo->l_prev_offset,
2c2fa1
+			  &l_prev, ptr_size) == 0
2c2fa1
+	 && read_one_ptr (lm_addr + lmo->l_next_offset,
2c2fa1
+			  &l_next, ptr_size) == 0)
2c2fa1
+    {
2c2fa1
+      unsigned char libname[PATH_MAX];
2c2fa1
 
2c2fa1
-      if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
2c2fa1
-			&lm_addr, ptr_size) != 0)
2c2fa1
+      if (lm_prev != l_prev)
2c2fa1
 	{
2c2fa1
-	  warning ("unable to read r_map from 0x%lx",
2c2fa1
-		   (long) priv->r_debug + lmo->r_map_offset);
2c2fa1
-	  goto done;
2c2fa1
+	  warning ("Corrupted shared library list: 0x%lx != 0x%lx",
2c2fa1
+		   (long) lm_prev, (long) l_prev);
2c2fa1
+	  break;
2c2fa1
 	}
2c2fa1
 
2c2fa1
-      lm_prev = 0;
2c2fa1
-      while (read_one_ptr (lm_addr + lmo->l_name_offset,
2c2fa1
-			   &l_name, ptr_size) == 0
2c2fa1
-	     && read_one_ptr (lm_addr + lmo->l_addr_offset,
2c2fa1
-			      &l_addr, ptr_size) == 0
2c2fa1
-	     && read_one_ptr (lm_addr + lmo->l_ld_offset,
2c2fa1
-			      &l_ld, ptr_size) == 0
2c2fa1
-	     && read_one_ptr (lm_addr + lmo->l_prev_offset,
2c2fa1
-			      &l_prev, ptr_size) == 0
2c2fa1
-	     && read_one_ptr (lm_addr + lmo->l_next_offset,
2c2fa1
-			      &l_next, ptr_size) == 0)
2c2fa1
+      /* Not checking for error because reading may stop before
2c2fa1
+	 we've got PATH_MAX worth of characters.  */
2c2fa1
+      libname[0] = '\0';
2c2fa1
+      linux_read_memory (l_name, libname, sizeof (libname) - 1);
2c2fa1
+      libname[sizeof (libname) - 1] = '\0';
2c2fa1
+      if (libname[0] != '\0')
2c2fa1
 	{
2c2fa1
-	  unsigned char libname[PATH_MAX];
2c2fa1
+	  /* 6x the size for xml_escape_text below.  */
2c2fa1
+	  size_t len = 6 * strlen ((char *) libname);
2c2fa1
+	  char *name;
2c2fa1
 
2c2fa1
-	  if (lm_prev != l_prev)
2c2fa1
+	  if (!header_done)
2c2fa1
 	    {
2c2fa1
-	      warning ("Corrupted shared library list: 0x%lx != 0x%lx",
2c2fa1
-		       (long) lm_prev, (long) l_prev);
2c2fa1
-	      break;
2c2fa1
+	      /* Terminate `
2c2fa1
+	      *p++ = '>';
2c2fa1
+	      header_done = 1;
2c2fa1
 	    }
2c2fa1
 
2c2fa1
-	  /* Not checking for error because reading may stop before
2c2fa1
-	     we've got PATH_MAX worth of characters.  */
2c2fa1
-	  libname[0] = '\0';
2c2fa1
-	  linux_read_memory (l_name, libname, sizeof (libname) - 1);
2c2fa1
-	  libname[sizeof (libname) - 1] = '\0';
2c2fa1
-	  if (libname[0] != '\0')
2c2fa1
+	  while (allocated < p - document + len + 200)
2c2fa1
 	    {
2c2fa1
-	      /* 6x the size for xml_escape_text below.  */
2c2fa1
-	      size_t len = 6 * strlen ((char *) libname);
2c2fa1
-	      char *name;
2c2fa1
-
2c2fa1
-	      if (!header_done)
2c2fa1
-		{
2c2fa1
-		  /* Terminate `
2c2fa1
-		  *p++ = '>';
2c2fa1
-		  header_done = 1;
2c2fa1
-		}
2c2fa1
-
2c2fa1
-	      while (allocated < p - document + len + 200)
2c2fa1
-		{
2c2fa1
-		  /* Expand to guarantee sufficient storage.  */
2c2fa1
-		  uintptr_t document_len = p - document;
2c2fa1
-
2c2fa1
-		  document = xrealloc (document, 2 * allocated);
2c2fa1
-		  allocated *= 2;
2c2fa1
-		  p = document + document_len;
2c2fa1
-		}
2c2fa1
-
2c2fa1
-	      name = xml_escape_text ((char *) libname);
2c2fa1
-	      p += sprintf (p, "
2c2fa1
-			       "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
2c2fa1
-			    name, (unsigned long) lm_addr,
2c2fa1
-			    (unsigned long) l_addr, (unsigned long) l_ld);
2c2fa1
-	      free (name);
2c2fa1
-	    }
2c2fa1
-	  else if (lm_prev == 0)
2c2fa1
-	    {
2c2fa1
-	      sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr);
2c2fa1
-	      p = p + strlen (p);
2c2fa1
-	    }
2c2fa1
+	      /* Expand to guarantee sufficient storage.  */
2c2fa1
+	      uintptr_t document_len = p - document;
2c2fa1
 
2c2fa1
-	  if (l_next == 0)
2c2fa1
-	    break;
2c2fa1
+	      document = xrealloc (document, 2 * allocated);
2c2fa1
+	      allocated *= 2;
2c2fa1
+	      p = document + document_len;
2c2fa1
+	    }
2c2fa1
 
2c2fa1
-	  lm_prev = lm_addr;
2c2fa1
-	  lm_addr = l_next;
2c2fa1
+	  name = xml_escape_text ((char *) libname);
2c2fa1
+	  p += sprintf (p, "
2c2fa1
+			"l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
2c2fa1
+			name, (unsigned long) lm_addr,
2c2fa1
+			(unsigned long) l_addr, (unsigned long) l_ld);
2c2fa1
+	  free (name);
2c2fa1
 	}
2c2fa1
-    done:
2c2fa1
-      if (!header_done)
2c2fa1
+      else if (lm_prev == 0)
2c2fa1
 	{
2c2fa1
-	  /* Empty list; terminate `
2c2fa1
-	  strcpy (p, "/>");
2c2fa1
+	  sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr);
2c2fa1
+	  p = p + strlen (p);
2c2fa1
 	}
2c2fa1
-      else
2c2fa1
-	strcpy (p, "</library-list-svr4>");
2c2fa1
+
2c2fa1
+      lm_prev = lm_addr;
2c2fa1
+      lm_addr = l_next;
2c2fa1
     }
2c2fa1
 
2c2fa1
+  if (!header_done)
2c2fa1
+    {
2c2fa1
+      /* Empty list; terminate `
2c2fa1
+      strcpy (p, "/>");
2c2fa1
+    }
2c2fa1
+  else
2c2fa1
+    strcpy (p, "</library-list-svr4>");
2c2fa1
+
2c2fa1
   document_len = strlen (document);
2c2fa1
   if (offset < document_len)
2c2fa1
     document_len -= offset;
2c2fa1
--- src/gdb/gdbserver/server.c	2013/05/24 11:28:06	1.191
2c2fa1
+++ src/gdb/gdbserver/server.c	2013/06/04 12:59:21	1.192
2c2fa1
@@ -1115,8 +1115,7 @@
2c2fa1
   if (writebuf != NULL)
2c2fa1
     return -2;
2c2fa1
 
2c2fa1
-  if (annex[0] != '\0' || !target_running ()
2c2fa1
-      || the_target->qxfer_libraries_svr4 == NULL)
2c2fa1
+  if (!target_running () || the_target->qxfer_libraries_svr4 == NULL)
2c2fa1
     return -1;
2c2fa1
 
2c2fa1
   return the_target->qxfer_libraries_svr4 (annex, readbuf, writebuf, offset, len);
2c2fa1
@@ -1743,7 +1742,8 @@
2c2fa1
 	       PBUFSIZ - 1);
2c2fa1
 
2c2fa1
       if (the_target->qxfer_libraries_svr4 != NULL)
2c2fa1
-	strcat (own_buf, ";qXfer:libraries-svr4:read+");
2c2fa1
+	strcat (own_buf, ";qXfer:libraries-svr4:read+"
2c2fa1
+		";augmented-libraries-svr4-read+");
2c2fa1
       else
2c2fa1
 	{
2c2fa1
 	  /* We do not have any hook to indicate whether the non-SVR4 target