[gdb] Make maint info sections print relocated addresses
authorTom de Vries <tdevries@suse.de>
Thu, 15 Aug 2019 22:25:14 +0000 (00:25 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 15 Aug 2019 22:25:14 +0000 (00:25 +0200)
When running gdb.base/compare-sections.exp with -fPIE/-pie, we get:
...
print /u *(unsigned char *) 0x00000238^M
Cannot access memory at address 0x238^M
(gdb) FAIL: gdb.base/compare-sections.exp: read-only: get value of read-only section
...

The problem is that that "maint info sections" prints an unrelocated address:
...
 [0]     0x00000238->0x00000254 at 0x00000238: .interp ALLOC LOAD READONLY \
                                                       DATA HAS_CONTENTS
...
while the test expects a relocated address.

Given that the documentation states that the command displays "the section
information displayed by info files", and that info files shows relocated
addresses:
...
        0x0000555555554238 - 0x0000555555554254 is .interp
...
fix this by showing relocated addresses for maint info sections as
well.

Build and tested on x86_64-linux.

gdb/ChangeLog:

2019-08-16  Tom de Vries  <tdevries@suse.de>

* maint.c (maintenance_info_sections): Also handle !ALLOBJ case using
print_objfile_section_info.

gdb/ChangeLog
gdb/maint.c

index 8512e9e332e691155b3bc5d0a6517b352ca9de88..151f78f2b88f79180a3e869fe91fc93c97b494e7 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-16  Tom de Vries  <tdevries@suse.de>
+
+       * maint.c (maintenance_info_sections): Also handle !ALLOBJ case using
+       print_objfile_section_info.
+
 2019-08-15  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-io.c (tui_puts_internal): Check TUI_CMD_WIN before
index f7485dc3ab76413f6cd72437111ce37157770662..837ed23cfb6b9217aacab4103b687eb7ba51ec15 100644 (file)
@@ -329,33 +329,36 @@ maintenance_info_sections (const char *arg, int from_tty)
 {
   if (exec_bfd)
     {
+      struct obj_section *osect;
+      bool allobj = false;
+
       printf_filtered (_("Exec file:\n"));
       printf_filtered ("    `%s', ", bfd_get_filename (exec_bfd));
       wrap_here ("        ");
       printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
-      if (arg && *arg && match_substring (arg, "ALLOBJ"))
-       {
-         struct obj_section *osect;
 
-         /* Only this function cares about the 'ALLOBJ' argument; 
-            if 'ALLOBJ' is the only argument, discard it rather than
-            passing it down to print_objfile_section_info (which 
-            wouldn't know how to handle it).  */
-         if (strcmp (arg, "ALLOBJ") == 0)
-           arg = NULL;
+      /* Only this function cares about the 'ALLOBJ' argument;
+        if 'ALLOBJ' is the only argument, discard it rather than
+        passing it down to print_objfile_section_info (which
+        wouldn't know how to handle it).  */
+      if (arg && strcmp (arg, "ALLOBJ") == 0)
+       {
+         arg = NULL;
+         allobj = true;
+       }
 
-         for (objfile *ofile : current_program_space->objfiles ())
+      for (objfile *ofile : current_program_space->objfiles ())
+       {
+         if (allobj)
+           printf_filtered (_("  Object file: %s\n"),
+                            bfd_get_filename (ofile->obfd));
+         ALL_OBJFILE_OSECTIONS (ofile, osect)
            {
-             printf_filtered (_("  Object file: %s\n"), 
-                              bfd_get_filename (ofile->obfd));
-             ALL_OBJFILE_OSECTIONS (ofile, osect)
-               {
-                 print_objfile_section_info (ofile->obfd, osect, arg);
-               }
+             if (!allobj && ofile->obfd != exec_bfd)
+               continue;
+             print_objfile_section_info (ofile->obfd, osect, arg);
            }
        }
-      else 
-       bfd_map_over_sections (exec_bfd, print_bfd_section_info, (void *) arg);
     }
 
   if (core_bfd)