Display the contents of a .debug.macinfo section
authorNick Clifton <nickc@redhat.com>
Thu, 5 Jul 2001 07:49:05 +0000 (07:49 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 5 Jul 2001 07:49:05 +0000 (07:49 +0000)
binutils/ChangeLog
binutils/NEWS
binutils/doc/binutils.texi
binutils/objcopy.c
binutils/readelf.c

index ffd5f2f41195b6f772caa4883236de4409048ffe..5249dabfc6f682510117b296469824ba83898522 100644 (file)
@@ -1,3 +1,15 @@
+2001-07-05  Daniel Berlin  <dan@cgsoftware.com>
+
+       * readelf.c (display_debug_macinfo): New function, display
+       .debug_macinfo section.
+       (do_debug_macinfo): New variable.
+       (parse_args): Handle "-w[mM]" to mean display macro info.
+       (process_section_headers): Handle debug_macinfo.
+       (debug_displays): Replace unsupported function with macinfo
+       function for .debug_macinfo display. 
+       * doc/binutils.texi: Document new command line switch.
+       * NEWS: Document new feature of readelf.
+       
 2001-07-05  H.J. Lu  <hjl@gnu.org>
 
        * objcopy.c (filter_symbols): Don't turn undefined symbols
index 1f139f757421c55255f7d89c24a132b47eb27432..8bdef05b8067d032b0a928c2300e16b26db8441b 100644 (file)
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* readelf: Support added for DWARF 2.1 extensions.  Support added for
+  displaying the contents of .debug.macinfo sections.
+
 * New command line switches added to objcopy to allow symbols to be kept as
   global symbols, and also to specify files containing lists of such symbols.
   by Honda Hiroki.
index 0011b117e59bbfc8058b6c72a5ca480d7b715799..33ec43fa7b904ac72f3768d840449b4b1707a030 100644 (file)
@@ -2785,7 +2785,7 @@ readelf [ -a | --all ]
         [ -V | --version-info]
         [ -D | --use-dynamic]
         [ -x <number> | --hex-dump=<number>]
-        [ -w[liaprf] | --debug-dump[=info,=line,=abbrev,=pubnames,=ranges,=frames]]
+        [ -w[liaprmf] | --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]]
         [      --histogram]
         [ -v | --version]
         [ -H | --help]
@@ -2886,8 +2886,8 @@ symbols section.
 @itemx --hex-dump=<number>
 Displays the contents of the indicated section as a hexadecimal dump.
 
-@item -w[liaprf]
-@itemx --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]
+@item -w[liaprmf]
+@itemx --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]
 Displays the contents of the debug sections in the file, if any are
 present.  If one of the optional letters or words follows the switch
 then only data found in those specific sections will be dumped.
index 3c8331a3c2c11c1821138f87bc6a93dfdff402d1..f412d3878521c7a857c87e6e1074001678472fa0 100644 (file)
@@ -807,7 +807,7 @@ filter_symbols (abfd, obfd, osyms, isyms, symcount)
        keep = 1;
       if (keep && is_strip_section (abfd, bfd_get_section (sym)))
        keep = 0;
-            
+
       if (keep && (flags & BSF_GLOBAL) != 0
          && (weaken || is_specified_symbol (name, weaken_specific_list)))
        {
@@ -1570,9 +1570,7 @@ copy_section (ibfd, isection, obfdarg)
          || strip_symbols == STRIP_ALL
          || discard_locals == LOCALS_ALL
          || convert_debugging))
-    {
-      return;
-    }
+    return;
 
   p = find_section_list (bfd_section_name (ibfd, isection), false);
 
@@ -1587,7 +1585,6 @@ copy_section (ibfd, isection, obfdarg)
   if (size == 0 || osection == 0)
     return;
 
-
   relsize = bfd_get_reloc_upper_bound (ibfd, isection);
   if (relsize < 0)
     RETURN_NONFATAL (bfd_get_filename (ibfd));
@@ -1619,6 +1616,33 @@ copy_section (ibfd, isection, obfdarg)
          free (relpp);
          relpp = temp_relpp;
        }
+      else if (sections_removed)
+       {
+         /* Remove relocations which are against symbols
+            in sections that have been removed, unless
+            the symbols are going to be preserved.  */
+         arelent ** temp_relpp;
+         asymbol *  sym;
+         long temp_relcount = 0;
+         long i;
+
+         temp_relpp = (arelent **) xmalloc (relsize);
+         for (i = 0; i < relcount; i++)
+           {
+             sym = *relpp [i]->sym_ptr_ptr;
+
+             /* FIXME: Should we warn about deleted relocs ?  */
+             if (is_specified_symbol (bfd_asymbol_name (sym),
+                                      keep_specific_list)
+                 || bfd_get_output_section (sym) != NULL)
+               temp_relpp [temp_relcount++] = relpp [i];
+           }
+
+         relcount = temp_relcount;
+         free (relpp);
+         relpp = temp_relpp;
+       }
+
       bfd_set_reloc (obfd, osection,
                     (relcount == 0 ? (arelent **) NULL : relpp), relcount);
     }
@@ -1753,14 +1777,22 @@ mark_symbols_used_in_relocations (ibfd, isection, symbolsarg)
   if (relcount < 0)
     bfd_fatal (bfd_get_filename (ibfd));
 
-  /* Examine each symbol used in a relocation.  If it's not one of the
-     special bfd section symbols, then mark it with BSF_KEEP.  */
+  /* Examine each symbol used in a relocation.  */
   for (i = 0; i < relcount; i++)
     {
-      if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
-         && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
-         && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
-       (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
+      asymbol * sym = * relpp[i]->sym_ptr_ptr;
+      
+      /* If the symbol's output section does not exist (because it
+        has been removed with -R) then do not keep the symbol.  */
+      if (bfd_get_output_section (sym) == NULL)
+       continue;
+      
+      /* If the symbols is not one of the special bfd
+        section symbols, then mark it with BSF_KEEP.  */
+      if (sym != bfd_com_section_ptr->symbol
+         && sym != bfd_abs_section_ptr->symbol
+         && sym != bfd_und_section_ptr->symbol)
+       sym->flags |= BSF_KEEP;
     }
 
   if (relpp != NULL)
index cfa7c130b24c484a02acf0e66f2c5cd6be0f5aac..4ec5ec09e4250550d352a072a4b354c67567e98f 100644 (file)
@@ -119,6 +119,7 @@ int                     do_debug_pubnames;
 int                     do_debug_aranges;
 int                     do_debug_frames;
 int                     do_debug_frames_interp;
+int                    do_debug_macinfo;
 int                     do_arch;
 int                     do_notes;
 int                    is_32bit_elf;
@@ -210,6 +211,7 @@ static int                display_debug_lines         PARAMS ((Elf32_Internal_Sh
 static int                display_debug_abbrev        PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
 static int                display_debug_aranges       PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
 static int                display_debug_frames        PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
+static int                display_debug_macinfo       PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
 static unsigned char *    process_abbrev_section      PARAMS ((unsigned char *, unsigned char *));
 static unsigned long      read_leb128                 PARAMS ((unsigned char *, int *, int));
 static int                process_extended_line_op    PARAMS ((unsigned char *, int, int));
@@ -2019,7 +2021,7 @@ usage ()
   fprintf (stdout, _("  -D or --use-dynamic       Use the dynamic section info when displaying symbols\n"));
   fprintf (stdout, _("  -x <number> or --hex-dump=<number>\n"));
   fprintf (stdout, _("                            Dump the contents of section <number>\n"));
-  fprintf (stdout, _("  -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"));
+  fprintf (stdout, _("  -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
   fprintf (stdout, _("                            Display the contents of DWARF2 debug sections\n"));
 #ifdef SUPPORT_DISASSEMBLY
   fprintf (stdout, _("  -i <number> or --instruction-dump=<number>\n"));
@@ -2189,6 +2191,11 @@ parse_args (argc, argv)
                  do_debug_frames = 1;
                  break;
 
+               case 'm':
+               case 'M':
+                 do_debug_macinfo = 1;
+                 break;
+
                default:
                  warn (_("Unrecognised debug option '%s'\n"), optarg);
                  break;
@@ -2935,7 +2942,7 @@ process_section_headers (file)
        }
       else if ((do_debugging || do_debug_info || do_debug_abbrevs
                || do_debug_lines || do_debug_pubnames || do_debug_aranges
-               || do_debug_frames)
+               || do_debug_frames || do_debug_macinfo)
               && strncmp (name, ".debug_", 7) == 0)
        {
          name += 7;
@@ -2947,6 +2954,7 @@ process_section_headers (file)
              || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
              || (do_debug_aranges  && (strcmp (name, "aranges") == 0))
              || (do_debug_frames   && (strcmp (name, "frame") == 0))
+             || (do_debug_macinfo  && (strcmp (name, "macinfo") == 0))
              )
            request_dump (i, DEBUG_DUMP);
        }
@@ -6264,6 +6272,80 @@ process_abbrev_section (start, end)
 }
 
 
+static int
+display_debug_macinfo (section, start, file)
+     Elf32_Internal_Shdr * section;
+     unsigned char *       start;
+     FILE *                file ATTRIBUTE_UNUSED;
+{
+  unsigned char * end = start + section->sh_size;
+  unsigned char * curr = start;
+  unsigned int bytes_read;
+  enum dwarf_macinfo_record_type op;
+
+  printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
+
+  while (curr < end)
+    {
+      unsigned int lineno;
+      const char * string;
+
+      op = * curr;
+      curr ++;
+
+      switch (op)
+       {
+       case DW_MACINFO_start_file:
+         {
+           unsigned int filenum;
+
+           lineno = read_leb128 (curr, & bytes_read, 0);
+           curr += bytes_read;
+           filenum = read_leb128 (curr, & bytes_read, 0);
+           curr += bytes_read;
+
+           printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
+         }
+         break;
+
+       case DW_MACINFO_end_file:
+         printf (_(" DW_MACINFO_end_file\n"));
+         break;
+
+       case DW_MACINFO_define:
+         lineno = read_leb128 (curr, & bytes_read, 0);
+         curr += bytes_read;
+         string = curr;
+         curr += strlen (string) + 1;
+         printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
+         break;
+
+       case DW_MACINFO_undef:
+         lineno = read_leb128 (curr, & bytes_read, 0);
+         curr += bytes_read;
+         string = curr;
+         curr += strlen (string) + 1;
+         printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
+         break;
+
+       case DW_MACINFO_vendor_ext:
+         {
+           unsigned int constant;
+
+           constant = read_leb128 (curr, & bytes_read, 0);
+           curr += bytes_read;
+           string = curr;
+           curr += strlen (string) + 1;
+           printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
+         }
+         break;
+       }
+    }
+
+  return 1;
+}
+  
+
 static int
 display_debug_abbrev (section, start, file)
      Elf32_Internal_Shdr * section;
@@ -7846,7 +7928,7 @@ debug_displays[] =
   { ".debug_pubnames",    display_debug_pubnames, NULL },
   { ".debug_frame",       display_debug_frames, NULL },
   { ".eh_frame",          display_debug_frames, NULL },
-  { ".debug_macinfo",     display_debug_not_supported, NULL },
+  { ".debug_macinfo",     display_debug_macinfo, NULL },
   { ".debug_str",         display_debug_not_supported, NULL },
   { ".debug_static_func", display_debug_not_supported, NULL },
   { ".debug_static_vars", display_debug_not_supported, NULL },