[14/16,v2] Suppress spurious warnings with extended-remote follow exec

Message ID 1408580964-27916-15-git-send-email-donb@codesourcery.com
State New, archived

Commit Message

Don Breazeal Aug. 21, 2014, 12:29 a.m. UTC
  This patch eliminates some spurious gdbserver warnings that occur when
following an exec on an extended-remote Linux target.

When gdbserver on Linux sets up the hook for shared library load
detection, an initial step is to read the version number from the
r_debug structure in memory.  In the current implementation, if the
version number is not equal to one, a warning was printed by gdbserver.
However, the number can be zero if the structure has not been 
initialized yet.

To suppress the warnings the error check was changed so that if
the version number is not equal to one the function silently returns
-1.  Subsequent calls to the routine find an initialized r_debug

Tested on x64 Ubuntu, both GDB tests and manual testing of following
an exec, then debugging a shared library loaded by the exec'd program
to ensure that there were no warnings and that debugging shared libs
was not adversely affected.


2014-08-20  Don Breazeal  <donb@codesourcery.com>

	* linux-low.c (linux_qxfer_libraries_svr4): Change
	handling of r_debug version mismatch.

 gdb/gdbserver/linux-low.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)


diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index f8bab6c..6be78a7 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -6226,10 +6226,15 @@  linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
 	  if (linux_read_memory (priv->r_debug + lmo->r_version_offset,
 				 (unsigned char *) &r_version,
-				 sizeof (r_version)) != 0
-	      || r_version != 1)
+				 sizeof (r_version)) != 0)
+	    warning ("error reading r_debug version from memory");
+	  else if (r_version != 1)
-	      warning ("unexpected r_debug version %d", r_version);
+	      /* If the version is incorrect, it probably means that
+		 r_debug hasn't been initialized yet.  Just silently
+		 return an error.  We will read it in a subsequent pass
+		 through here.  */
+	      return -1;
 	  else if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
 				 &lm_addr, ptr_size) != 0)