aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2001-07-05 07:49:05 +0000
committerNick Clifton <nickc@redhat.com>2001-07-05 07:49:05 +0000
commite0c60db2304c4c0db3f666d0d41b18a1406f68fc (patch)
tree8189a10e53b8b5daaa1167cf39c1eaea27ed8058
parent4ad09363567ee09460973d1eddebec6d77528b69 (diff)
downloadgdb-e0c60db2304c4c0db3f666d0d41b18a1406f68fc.zip
gdb-e0c60db2304c4c0db3f666d0d41b18a1406f68fc.tar.gz
gdb-e0c60db2304c4c0db3f666d0d41b18a1406f68fc.tar.bz2
Display the contents of a .debug.macinfo section
-rw-r--r--binutils/ChangeLog12
-rw-r--r--binutils/NEWS3
-rw-r--r--binutils/doc/binutils.texi6
-rw-r--r--binutils/objcopy.c54
-rw-r--r--binutils/readelf.c88
5 files changed, 146 insertions, 17 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index ffd5f2f..5249dab 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/NEWS b/binutils/NEWS
index 1f139f7..8bdef05 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -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.
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 0011b11..33ec43f 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -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.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 3c8331a..f412d38 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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)
diff --git a/binutils/readelf.c b/binutils/readelf.c
index cfa7c13..4ec5ec0 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -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);
}
@@ -6265,6 +6273,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;
unsigned char * start;
@@ -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 },