RFA/remote: compare-sections

Message ID 24262.1395849610@usendtaylorx2l
State Superseded
Headers

Commit Message

David Taylor March 26, 2014, 4 p.m. UTC
  Motivation:

When connecting to a remote system, we use the compare-sections command
to verify that the box is running the code that we think it is running.
Since the system is up and running and *NOT* 'freshly downloaded without
yet executing anything', read-write sections, of course, differ from
what they were in the executable file.

Comparing read-write sections takes time and more importantly the
MIS-MATCHED output is confusing to some users.

The compare-sections command compares all loadable sections including
read-write sections.  This patch gives the user the option to compare
just the loadable read-only sections.

For gdb/ChangeLog:

2014-03-26  David Taylor  <dtaylor@emc.com>

	* remote.c (compare_sections_command): Add -r option to compare
	all loadable read-only sections.

For gdb/doc/ChangeLog:

2014-03-26  David Taylor  <dtaylor@emc.com>

	* gdb.texinfo (compare-sections): Document the new -r (read-only)
	option.

I'm not sure that this patch is big enough to require a copyright
assignment, but regardless, EMC has a copyright assignment on file for
GDB (and GCC and BINUTILS as well).

If it is approved, I will need someone else to commit it as I don't have
write access.

Patch:
  

Comments

Eli Zaretskii March 26, 2014, 5:51 p.m. UTC | #1
> From: David Taylor <dtaylor@emc.com>
> Date: Wed, 26 Mar 2014 12:00:10 -0400
> 
> For gdb/ChangeLog:
> 
> 2014-03-26  David Taylor  <dtaylor@emc.com>
> 
> 	* remote.c (compare_sections_command): Add -r option to compare
> 	all loadable read-only sections.
> 
> For gdb/doc/ChangeLog:
> 
> 2014-03-26  David Taylor  <dtaylor@emc.com>
> 
> 	* gdb.texinfo (compare-sections): Document the new -r (read-only)
> 	option.

OK for the documentation part, but I think this warrants a NEWS entry.

Thanks.
  
David Taylor April 3, 2014, 8:38 p.m. UTC | #2
ping.

David Taylor <dtaylor@emc.com> wrote:

> Motivation:
> 
> When connecting to a remote system, we use the compare-sections command
> to verify that the box is running the code that we think it is running.
> Since the system is up and running and *NOT* 'freshly downloaded without
> yet executing anything', read-write sections, of course, differ from
> what they were in the executable file.
> 
> Comparing read-write sections takes time and more importantly the
> MIS-MATCHED output is confusing to some users.
> 
> The compare-sections command compares all loadable sections including
> read-write sections.  This patch gives the user the option to compare
> just the loadable read-only sections.
> 
> For gdb/ChangeLog:
> 
> 2014-03-26  David Taylor  <dtaylor@emc.com>
> 
> 	* remote.c (compare_sections_command): Add -r option to compare
> 	all loadable read-only sections.
> 
> For gdb/doc/ChangeLog:
> 
> 2014-03-26  David Taylor  <dtaylor@emc.com>
> 
> 	* gdb.texinfo (compare-sections): Document the new -r (read-only)
> 	option.
> 
> I'm not sure that this patch is big enough to require a copyright
> assignment, but regardless, EMC has a copyright assignment on file for
> GDB (and GCC and BINUTILS as well).
> 
> If it is approved, I will need someone else to commit it as I don't have
> write access.
> 
> Patch:
> 
> Index: gdb/remote.c
> ===================================================================
> RCS file: /home/cvsroot/GDB/gdb/remote.c,v
> retrieving revision 1.8
> diff -u -r1.8 remote.c
> --- gdb/remote.c	26 Mar 2014 14:12:34 -0000	1.8
> +++ gdb/remote.c	26 Mar 2014 15:49:40 -0000
> @@ -8664,6 +8664,7 @@
>    int matched = 0;
>    int mismatched = 0;
>    int res;
> +  int read_only = 0;
>  
>    if (!exec_bfd)
>      error (_("command cannot be used without an exec file"));
> @@ -8671,11 +8672,20 @@
>    /* Make sure the remote is pointing at the right process.  */
>    set_general_process ();
>  
> +  if (args && (strcmp (args, "-r") == 0))
> +    {
> +      read_only = 1;
> +      args = NULL;
> +    }
> +
>    for (s = exec_bfd->sections; s; s = s->next)
>      {
>        if (!(s->flags & SEC_LOAD))
>  	continue;		/* Skip non-loadable section.  */
>  
> +      if (read_only && ((s->flags & SEC_READONLY) == 0))
> +	continue;		/* Skip writeable sections */
> +
>        size = bfd_get_section_size (s);
>        if (size == 0)
>  	continue;		/* Skip zero-length section.  */
> @@ -12046,7 +12056,8 @@
>  
>    add_cmd ("compare-sections", class_obscure, compare_sections_command, _("\
>  Compare section data on target to the exec file.\n\
> -Argument is a single section name (default: all loaded sections)."),
> +Argument is a single section name (default: all loaded sections).\n\
> +To compare only read-only loaded sections, specify the -r option."),
>  	   &cmdlist);
>  
>    add_cmd ("packet", class_maintenance, packet_command, _("\
> Index: gdb/doc/gdb.texinfo
> ===================================================================
> RCS file: /home/cvsroot/GDB/gdb/doc/gdb.texinfo,v
> retrieving revision 1.1.1.2
> diff -u -r1.1.1.2 gdb.texinfo
> --- gdb/doc/gdb.texinfo	18 Feb 2014 15:36:03 -0000	1.1.1.2
> +++ gdb/doc/gdb.texinfo	26 Mar 2014 15:49:40 -0000
> @@ -8760,11 +8760,12 @@
>  
>  @table @code
>  @kindex compare-sections
> -@item compare-sections @r{[}@var{section-name}@r{]}
> +@item compare-sections @r{[}@var{section-name}@r{|}@code{-r}@r{]}
>  Compare the data of a loadable section @var{section-name} in the
>  executable file of the program being debugged with the same section in
>  the remote machine's memory, and report any mismatches.  With no
> -arguments, compares all loadable sections.  This command's
> +arguments, compares all loadable sections.  With an argument of
> +@code{-r}, compares all loadable read-only sections.  This command's
>  availability depends on the target's support for the @code{"qCRC"}
>  remote request.
>  @end table
>
  
Eli Zaretskii April 4, 2014, 7:54 a.m. UTC | #3
> Date: Thu, 03 Apr 2014 16:38:49 -0400
> From: David Taylor <dtaylor@emc.com>
> 
> ping.

I already approved the documentation part.
  
David Taylor April 4, 2014, 12:37 p.m. UTC | #4
Eli Zaretskii <eliz@gnu.org> wrote:

> > Date: Thu, 03 Apr 2014 16:38:49 -0400
> > From: David Taylor <dtaylor@emc.com>
> > 
> > ping.
> 
> I already approved the documentation part.

Yes, thank you.  I have never heard from anyone about the
non-documentation parts.
  
David Taylor April 16, 2014, 4:43 p.m. UTC | #5
Final ping.  I initially posted this three weeks ago.  Eli Zaretskii
immediately approved the doc part.  The remainder has been ignored.
I pinged two weeks ago.  The remainder continues to be unreviewed.

We (at EMC) find it useful.  I will not ping further on it.  I hope it
goes in eventually, but have resigned myself to having to maintain it
as a local change.  Sigh.

EMC has a copyright assignment on file with the FSF (plus this is small
enought that I'm not sure it is copyrightable), so anyone who wishes to
do so should feel free to incorporate it into their local versions of
GDB.

David Taylor <dtaylor@emc.com> wrote:
 
> ping.
> 
> David Taylor <dtaylor@emc.com> wrote:
> 
> > Motivation:
> > 
> > When connecting to a remote system, we use the compare-sections command
> > to verify that the box is running the code that we think it is running.
> > Since the system is up and running and *NOT* 'freshly downloaded without
> > yet executing anything', read-write sections, of course, differ from
> > what they were in the executable file.
> > 
> > Comparing read-write sections takes time and more importantly the
> > MIS-MATCHED output is confusing to some users.
> > 
> > The compare-sections command compares all loadable sections including
> > read-write sections.  This patch gives the user the option to compare
> > just the loadable read-only sections.
> > 
> > For gdb/ChangeLog:
> > 
> > 2014-03-26  David Taylor  <dtaylor@emc.com>
> > 
> > 	* remote.c (compare_sections_command): Add -r option to compare
> > 	all loadable read-only sections.
> > 
> > For gdb/doc/ChangeLog:
> > 
> > 2014-03-26  David Taylor  <dtaylor@emc.com>
> > 
> > 	* gdb.texinfo (compare-sections): Document the new -r (read-only)
> > 	option.
> > 
> > I'm not sure that this patch is big enough to require a copyright
> > assignment, but regardless, EMC has a copyright assignment on file for
> > GDB (and GCC and BINUTILS as well).
> > 
> > If it is approved, I will need someone else to commit it as I don't have
> > write access.
> > 
> > Patch:
> > 
> > Index: gdb/remote.c
> > ===================================================================
> > RCS file: /home/cvsroot/GDB/gdb/remote.c,v
> > retrieving revision 1.8
> > diff -u -r1.8 remote.c
> > --- gdb/remote.c	26 Mar 2014 14:12:34 -0000	1.8
> > +++ gdb/remote.c	26 Mar 2014 15:49:40 -0000
> > @@ -8664,6 +8664,7 @@
> >    int matched = 0;
> >    int mismatched = 0;
> >    int res;
> > +  int read_only = 0;
> >  
> >    if (!exec_bfd)
> >      error (_("command cannot be used without an exec file"));
> > @@ -8671,11 +8672,20 @@
> >    /* Make sure the remote is pointing at the right process.  */
> >    set_general_process ();
> >  
> > +  if (args && (strcmp (args, "-r") == 0))
> > +    {
> > +      read_only = 1;
> > +      args = NULL;
> > +    }
> > +
> >    for (s = exec_bfd->sections; s; s = s->next)
> >      {
> >        if (!(s->flags & SEC_LOAD))
> >  	continue;		/* Skip non-loadable section.  */
> >  
> > +      if (read_only && ((s->flags & SEC_READONLY) == 0))
> > +	continue;		/* Skip writeable sections */
> > +
> >        size = bfd_get_section_size (s);
> >        if (size == 0)
> >  	continue;		/* Skip zero-length section.  */
> > @@ -12046,7 +12056,8 @@
> >  
> >    add_cmd ("compare-sections", class_obscure, compare_sections_command, _("\
> >  Compare section data on target to the exec file.\n\
> > -Argument is a single section name (default: all loaded sections)."),
> > +Argument is a single section name (default: all loaded sections).\n\
> > +To compare only read-only loaded sections, specify the -r option."),
> >  	   &cmdlist);
> >  
> >    add_cmd ("packet", class_maintenance, packet_command, _("\
> > Index: gdb/doc/gdb.texinfo
> > ===================================================================
> > RCS file: /home/cvsroot/GDB/gdb/doc/gdb.texinfo,v
> > retrieving revision 1.1.1.2
> > diff -u -r1.1.1.2 gdb.texinfo
> > --- gdb/doc/gdb.texinfo	18 Feb 2014 15:36:03 -0000	1.1.1.2
> > +++ gdb/doc/gdb.texinfo	26 Mar 2014 15:49:40 -0000
> > @@ -8760,11 +8760,12 @@
> >  
> >  @table @code
> >  @kindex compare-sections
> > -@item compare-sections @r{[}@var{section-name}@r{]}
> > +@item compare-sections @r{[}@var{section-name}@r{|}@code{-r}@r{]}
> >  Compare the data of a loadable section @var{section-name} in the
> >  executable file of the program being debugged with the same section in
> >  the remote machine's memory, and report any mismatches.  With no
> > -arguments, compares all loadable sections.  This command's
> > +arguments, compares all loadable sections.  With an argument of
> > +@code{-r}, compares all loadable read-only sections.  This command's
> >  availability depends on the target's support for the @code{"qCRC"}
> >  remote request.
> >  @end table
> > 
>
  
Keith Seitz April 16, 2014, 10:30 p.m. UTC | #6
On 04/16/2014 09:43 AM, David Taylor wrote:
> Final ping.

Hi, David,

I am really sorry that patch reviewing is going so slowly right now. It 
appears the few active maintainers we have are (extremely) busy with 
"work." As it is, I think maintainers are probably several /months/ 
behind on patch reviews. There are neither enough people to review 
patches nor enough maintainers to approve patches after random folk 
(like me) make recommendations.

So please don't feel that you've been singled out. It is a growing pain 
that gdb is experiencing right now.

>>> Motivation:
>>>
>>> When connecting to a remote system, we use the compare-sections command
>>> to verify that the box is running the code that we think it is running.
>>> Since the system is up and running and *NOT* 'freshly downloaded without
>>> yet executing anything', read-write sections, of course, differ from
>>> what they were in the executable file.
>>>
>>> Comparing read-write sections takes time and more importantly the
>>> MIS-MATCHED output is confusing to some users.
>>>
>>> The compare-sections command compares all loadable sections including
>>> read-write sections.  This patch gives the user the option to compare
>>> just the loadable read-only sections.

This is excellent. Thank you for providing this information. I found it 
very useful.

>>> Index: gdb/remote.c
>>> ===================================================================
>>> RCS file: /home/cvsroot/GDB/gdb/remote.c,v
>>> retrieving revision 1.8
>>> diff -u -r1.8 remote.c
>>> --- gdb/remote.c	26 Mar 2014 14:12:34 -0000	1.8
>>> +++ gdb/remote.c	26 Mar 2014 15:49:40 -0000
>>> @@ -8664,6 +8664,7 @@
>>>     int matched = 0;
>>>     int mismatched = 0;
>>>     int res;
>>> +  int read_only = 0;
>>>
>>>     if (!exec_bfd)
>>>       error (_("command cannot be used without an exec file"));
>>> @@ -8671,11 +8672,20 @@
>>>     /* Make sure the remote is pointing at the right process.  */
>>>     set_general_process ();
>>>
>>> +  if (args && (strcmp (args, "-r") == 0))
>>> +    {
>>> +      read_only = 1;
>>> +      args = NULL;
>>> +    }

Two (and one-half) things:

1) It was recently agreed that we would now explicitly check pointers 
against NULL.

2) I think it better/more consistent to use check_for_argument (in 
cli/cli-utils.[ch]) for this:

   if (args != NULL
       && check_for_argument (&args, "-r", sizeof ("-r") - 1))
     read_only = 1;

2.5) I'm a testing freak, so I'd really like to see is a test case. 
Alas, I see that there are no tests /at all/ for compare-sections, so 
that may be heaping more hardship onto this than is either necessary or 
plausible. I am not going to ask you to provide one because of this, but 
a global maintainer might.

In any case, with the two changes above, I recommend that this patch be 
approved by a maintainer.

Keith

>>> +
>>>     for (s = exec_bfd->sections; s; s = s->next)
>>>       {
>>>         if (!(s->flags & SEC_LOAD))
>>>   	continue;		/* Skip non-loadable section.  */
>>>
>>> +      if (read_only && ((s->flags & SEC_READONLY) == 0))
>>> +	continue;		/* Skip writeable sections */
>>> +
>>>         size = bfd_get_section_size (s);
>>>         if (size == 0)
>>>   	continue;		/* Skip zero-length section.  */
>>> @@ -12046,7 +12056,8 @@
>>>
>>>     add_cmd ("compare-sections", class_obscure, compare_sections_command, _("\
>>>   Compare section data on target to the exec file.\n\
>>> -Argument is a single section name (default: all loaded sections)."),
>>> +Argument is a single section name (default: all loaded sections).\n\
>>> +To compare only read-only loaded sections, specify the -r option."),
>>>   	   &cmdlist);
>>>
>>>     add_cmd ("packet", class_maintenance, packet_command, _("\
>>> Index: gdb/doc/gdb.texinfo
>>> ===================================================================
>>> RCS file: /home/cvsroot/GDB/gdb/doc/gdb.texinfo,v
>>> retrieving revision 1.1.1.2
>>> diff -u -r1.1.1.2 gdb.texinfo
>>> --- gdb/doc/gdb.texinfo	18 Feb 2014 15:36:03 -0000	1.1.1.2
>>> +++ gdb/doc/gdb.texinfo	26 Mar 2014 15:49:40 -0000
>>> @@ -8760,11 +8760,12 @@
>>>
>>>   @table @code
>>>   @kindex compare-sections
>>> -@item compare-sections @r{[}@var{section-name}@r{]}
>>> +@item compare-sections @r{[}@var{section-name}@r{|}@code{-r}@r{]}
>>>   Compare the data of a loadable section @var{section-name} in the
>>>   executable file of the program being debugged with the same section in
>>>   the remote machine's memory, and report any mismatches.  With no
>>> -arguments, compares all loadable sections.  This command's
>>> +arguments, compares all loadable sections.  With an argument of
>>> +@code{-r}, compares all loadable read-only sections.  This command's
>>>   availability depends on the target's support for the @code{"qCRC"}
>>>   remote request.
>>>   @end table
>>>
>>
  

Patch

Index: gdb/remote.c
===================================================================
RCS file: /home/cvsroot/GDB/gdb/remote.c,v
retrieving revision 1.8
diff -u -r1.8 remote.c
--- gdb/remote.c	26 Mar 2014 14:12:34 -0000	1.8
+++ gdb/remote.c	26 Mar 2014 15:49:40 -0000
@@ -8664,6 +8664,7 @@ 
   int matched = 0;
   int mismatched = 0;
   int res;
+  int read_only = 0;
 
   if (!exec_bfd)
     error (_("command cannot be used without an exec file"));
@@ -8671,11 +8672,20 @@ 
   /* Make sure the remote is pointing at the right process.  */
   set_general_process ();
 
+  if (args && (strcmp (args, "-r") == 0))
+    {
+      read_only = 1;
+      args = NULL;
+    }
+
   for (s = exec_bfd->sections; s; s = s->next)
     {
       if (!(s->flags & SEC_LOAD))
 	continue;		/* Skip non-loadable section.  */
 
+      if (read_only && ((s->flags & SEC_READONLY) == 0))
+	continue;		/* Skip writeable sections */
+
       size = bfd_get_section_size (s);
       if (size == 0)
 	continue;		/* Skip zero-length section.  */
@@ -12046,7 +12056,8 @@ 
 
   add_cmd ("compare-sections", class_obscure, compare_sections_command, _("\
 Compare section data on target to the exec file.\n\
-Argument is a single section name (default: all loaded sections)."),
+Argument is a single section name (default: all loaded sections).\n\
+To compare only read-only loaded sections, specify the -r option."),
 	   &cmdlist);
 
   add_cmd ("packet", class_maintenance, packet_command, _("\
Index: gdb/doc/gdb.texinfo
===================================================================
RCS file: /home/cvsroot/GDB/gdb/doc/gdb.texinfo,v
retrieving revision 1.1.1.2
diff -u -r1.1.1.2 gdb.texinfo
--- gdb/doc/gdb.texinfo	18 Feb 2014 15:36:03 -0000	1.1.1.2
+++ gdb/doc/gdb.texinfo	26 Mar 2014 15:49:40 -0000
@@ -8760,11 +8760,12 @@ 
 
 @table @code
 @kindex compare-sections
-@item compare-sections @r{[}@var{section-name}@r{]}
+@item compare-sections @r{[}@var{section-name}@r{|}@code{-r}@r{]}
 Compare the data of a loadable section @var{section-name} in the
 executable file of the program being debugged with the same section in
 the remote machine's memory, and report any mismatches.  With no
-arguments, compares all loadable sections.  This command's
+arguments, compares all loadable sections.  With an argument of
+@code{-r}, compares all loadable read-only sections.  This command's
 availability depends on the target's support for the @code{"qCRC"}
 remote request.
 @end table