RFA/remote: compare-sections

David Taylor
2014-03-26T16:00:26Z

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