summaryrefslogtreecommitdiff
path: root/binutils/od-elf32_avr.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2015-01-08 21:55:43 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2015-02-25 23:17:27 +0000
commit137c83d69fad77677cc818593f9399caa777a0c5 (patch)
tree3a3c32502d2caca7ede6a974a35bf3e960224abd /binutils/od-elf32_avr.c
parentfdd410ac7a07dfb47dcb992201000582a280d8b2 (diff)
avr/objdump: Support dumping .avr.prop section.
Add support to objdump for dumping the .avr.prop section in a structured way. binutils/ChangeLog: * od-elf32_avr.c: Add elf32-avr.h include. (OPT_AVRPROP): Define. (options[]): Add 'avr-prop' entry. (elf32_avr_help): Add avr-prop help text. (elf32_avr_dump_avr_prop): New function. (elf32_avr_dump): Add check for avr-prop. bfd/ChangeLog: * elf32-avr.h (struct avr_property_header): New strucure. (avr_elf32_load_property_records): Declare. (avr_elf32_property_record_name): Declare. * elf32-avr.c: Add bfd_stdint.h include. (retrieve_local_syms): New function. (get_elf_r_symndx_section): New function. (get_elf_r_symndx_offset): New function. (internal_reloc_compare): New function. (struct avr_find_section_data): New structure. (avr_is_section_for_address): New function. (avr_find_section_for_address): New function. (avr_elf32_load_records_from_section): New function. (avr_elf32_load_property_records): New function. (avr_elf32_property_record_name): New function. gas/testsuite/ChangeLog: * gas/avr/avr-prop-1.d: New file. * gas/avr/avr-prop-1.s: New file.
Diffstat (limited to 'binutils/od-elf32_avr.c')
-rw-r--r--binutils/od-elf32_avr.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/binutils/od-elf32_avr.c b/binutils/od-elf32_avr.c
index 5e828fb339..5635964c1c 100644
--- a/binutils/od-elf32_avr.c
+++ b/binutils/od-elf32_avr.c
@@ -31,14 +31,17 @@
#include "bfd.h"
#include "elf/external.h"
#include "elf/internal.h"
+#include "elf32-avr.h"
/* Index of the options in the options[] array. */
#define OPT_MEMUSAGE 0
+#define OPT_AVRPROP 1
/* List of actions. */
static struct objdump_private_option options[] =
{
{ "mem-usage", 0 },
+ { "avr-prop", 0},
{ NULL, 0 }
};
@@ -50,6 +53,7 @@ elf32_avr_help (FILE *stream)
fprintf (stream, _("\
For AVR ELF files:\n\
mem-usage Display memory usage\n\
+ avr-prop Display contents of .avr.prop section\n\
"));
}
@@ -234,10 +238,60 @@ elf32_avr_dump_mem_usage (bfd *abfd)
}
static void
+elf32_avr_dump_avr_prop (bfd *abfd)
+{
+ struct avr_property_record_list *r_list;
+ unsigned int i;
+
+ r_list = avr_elf32_load_property_records (abfd);
+ if (r_list == NULL)
+ return;
+
+ printf ("\nContents of `%s' section:\n\n", r_list->section->name);
+
+ printf (" Version: %d\n", r_list->version);
+ printf (" Flags: %#x\n\n", r_list->flags);
+
+ for (i = 0; i < r_list->record_count; ++i)
+ {
+ printf (" %d %s @ %s + %#08lx (%#08lx)\n",
+ i,
+ avr_elf32_property_record_name (&r_list->records [i]),
+ r_list->records [i].section->name,
+ r_list->records [i].offset,
+ (bfd_get_section_vma (abfd, r_list->records [i].section)
+ + r_list->records [i].offset));
+ switch (r_list->records [i].type)
+ {
+ case RECORD_ORG:
+ /* Nothing else to print. */
+ break;
+ case RECORD_ORG_AND_FILL:
+ printf (" Fill: %#08lx\n",
+ r_list->records [i].data.org.fill);
+ break;
+ case RECORD_ALIGN:
+ printf (" Align: %#08lx\n",
+ r_list->records [i].data.align.bytes);
+ break;
+ case RECORD_ALIGN_AND_FILL:
+ printf (" Align: %#08lx, Fill: %#08lx\n",
+ r_list->records [i].data.align.bytes,
+ r_list->records [i].data.org.fill);
+ break;
+ }
+ }
+
+ free (r_list);
+}
+
+static void
elf32_avr_dump (bfd *abfd)
{
if (options[OPT_MEMUSAGE].selected)
elf32_avr_dump_mem_usage (abfd);
+ if (options[OPT_AVRPROP].selected)
+ elf32_avr_dump_avr_prop (abfd);
}
const struct objdump_private_desc objdump_private_desc_elf32_avr =