aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog9
-rw-r--r--binutils/NEWS2
-rw-r--r--binutils/doc/binutils.texi8
-rw-r--r--binutils/readelf.c75
4 files changed, 84 insertions, 10 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 54a7c0f..c025d1c 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-14 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * readelf.c (struct dump_list_entry, request_dump_byname)
+ (initialise_dumps_byname): New.
+ (parse_args): Call request_dump_byname.
+ (process_section_contents): Call initialise_dumps_byname.
+ * doc/binutils.texi (readelf): Mention -x NAME.
+ * NEWS: Likewise.
+
2005-11-11 Nick Clifton <nickc@redhat.com>
PR 1150
diff --git a/binutils/NEWS b/binutils/NEWS
index 76c4dd7..d12450e 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,7 @@
-*- text -*-
+* Add "-x NAME" to readelf in addition to "-x NUMBER".
+
* Add -i and -t switches to cxxfilt. -i disables the display of implementation
specific extra demangling information (if any) and -t disables the demangling
of types.
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 581e8b6..f01919a 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -3324,7 +3324,7 @@ readelf [@option{-a}|@option{--all}]
[@option{-V}|@option{--version-info}]
[@option{-A}|@option{--arch-specific}]
[@option{-D}|@option{--use-dynamic}]
- [@option{-x} <number>|@option{--hex-dump=}<number>]
+ [@option{-x} <number or name>|@option{--hex-dump=}<number or name>]
[@option{-w[liaprmfFsoR]}|
@option{--debug-dump}[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]]
[@option{-I}|@option{-histogram}]
@@ -3444,9 +3444,11 @@ When displaying symbols, this option makes @command{readelf} use the
symbol table in the file's dynamic section, rather than the one in the
symbols section.
-@item -x <number>
-@itemx --hex-dump=<number>
+@item -x <number or name>
+@itemx --hex-dump=<number or name>
Displays the contents of the indicated section as a hexadecimal dump.
+A number identifies a particular section by index in the section table;
+any other string identifies all sections with that name in the object file.
@item -w[liaprmfFsoR]
@itemx --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 3e8eb20..7c8b424 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -177,6 +177,16 @@ static size_t group_count;
static struct group *section_groups;
static struct group **section_headers_groups;
+/* A linked list of the section names for which dumps were requested
+ by name. */
+struct dump_list_entry
+{
+ char *name;
+ int type;
+ struct dump_list_entry *next;
+};
+static struct dump_list_entry *dump_sects_byname;
+
/* A dynamic array of flags indicating for which sections a hex dump
has been requested (via the -x switch) and/or a disassembly dump
(via the -i switch). */
@@ -185,8 +195,9 @@ unsigned num_cmdline_dump_sects = 0;
/* A dynamic array of flags indicating for which sections a dump of
some kind has been requested. It is reset on a per-object file
- basis and then initialised from the cmdline_dump_sects array and
- the results of interpreting the -w switch. */
+ basis and then initialised from the cmdline_dump_sects array,
+ the results of interpreting the -w switch, and the
+ dump_sects_byname list. */
char *dump_sects = NULL;
unsigned int num_dump_sects = 0;
@@ -2658,6 +2669,27 @@ request_dump (unsigned int section, int type)
return;
}
+/* Request a dump by section name. */
+
+static void
+request_dump_byname (const char *section, int type)
+{
+ struct dump_list_entry *new_request;
+
+ new_request = malloc (sizeof (struct dump_list_entry));
+ if (!new_request)
+ error (_("Out of memory allocating dump request table."));
+
+ new_request->name = strdup (section);
+ if (!new_request->name)
+ error (_("Out of memory allocating dump request table."));
+
+ new_request->type = type;
+
+ new_request->next = dump_sects_byname;
+ dump_sects_byname = new_request;
+}
+
static void
parse_args (int argc, char **argv)
{
@@ -2745,11 +2777,10 @@ parse_args (int argc, char **argv)
do_dump++;
section = strtoul (optarg, & cp, 0);
if (! *cp && section >= 0)
- {
- request_dump (section, HEX_DUMP);
- break;
- }
- goto oops;
+ request_dump (section, HEX_DUMP);
+ else
+ request_dump_byname (optarg, HEX_DUMP);
+ break;
case 'w':
do_dump++;
if (optarg == 0)
@@ -2913,7 +2944,9 @@ parse_args (int argc, char **argv)
do_wide++;
break;
default:
+#ifdef SUPPORT_DISASSEMBLY
oops:
+#endif
/* xgettext:c-format */
error (_("Invalid option '-%c'\n"), c);
/* Drop through. */
@@ -7547,6 +7580,32 @@ display_debug_section (Elf_Internal_Shdr *section, FILE *file)
return result;
}
+/* Set DUMP_SECTS for all sections where dumps were requested
+ based on section name. */
+
+static void
+initialise_dumps_byname (void)
+{
+ struct dump_list_entry *cur;
+
+ for (cur = dump_sects_byname; cur; cur = cur->next)
+ {
+ unsigned int i;
+ int any;
+
+ for (i = 0, any = 0; i < elf_header.e_shnum; i++)
+ if (streq (SECTION_NAME (section_headers + i), cur->name))
+ {
+ request_dump (i, cur->type);
+ any = 1;
+ }
+
+ if (!any)
+ warn (_("Section '%s' was not dumped because it does not exist!\n"),
+ cur->name);
+ }
+}
+
static void
process_section_contents (FILE *file)
{
@@ -7556,6 +7615,8 @@ process_section_contents (FILE *file)
if (! do_dump)
return;
+ initialise_dumps_byname ();
+
for (i = 0, section = section_headers;
i < elf_header.e_shnum && i < num_dump_sects;
i++, section++)