diff options
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/readelf.c | 80 |
2 files changed, 56 insertions, 31 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a1a5c91..b4d386d 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,5 +1,12 @@ 2004-06-22 Alan Modra <amodra@bigpond.net.au> + * readelf.c (Elf32_Word): Delete. + (get_32bit_dynamic_section): Handle SGI ELF dynamic segment. + (get_64bit_dynamic_section): Likewise. + + * readelf.c (get_32bit_dynamic_section): Stop at first DT_NULL entry. + (get_64bit_dynamic_section): Likewise. + * readelf.c (dynamic_nent): New variable. (get_32bit_dynamic_section): Set it. (get_64bit_dynamic_section): Here too. diff --git a/binutils/readelf.c b/binutils/readelf.c index 3cd6ffb..2866fee 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -206,8 +206,6 @@ print_mode; static bfd_vma (*byte_get) (unsigned char *, int); static void (*byte_put) (unsigned char *, bfd_vma, int); -typedef int Elf32_Word; - #define UNKNOWN -1 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \ @@ -1010,10 +1008,10 @@ dump_relocations (FILE *file, rtype = elf_i386_reloc_type (type); break; - case EM_68HC11: - case EM_68HC12: - rtype = elf_m68hc11_reloc_type (type); - break; + case EM_68HC11: + case EM_68HC12: + rtype = elf_m68hc11_reloc_type (type); + break; case EM_68K: rtype = elf_m68k_reloc_type (type); @@ -1073,9 +1071,9 @@ dump_relocations (FILE *file, rtype = elf_fr30_reloc_type (type); break; - case EM_CYGNUS_FRV: - rtype = elf_frv_reloc_type (type); - break; + case EM_CYGNUS_FRV: + rtype = elf_frv_reloc_type (type); + break; case EM_MCORE: rtype = elf_mcore_reloc_type (type); @@ -1553,9 +1551,9 @@ get_file_type (unsigned e_type) { case ET_NONE: return _("NONE (None)"); case ET_REL: return _("REL (Relocatable file)"); - case ET_EXEC: return _("EXEC (Executable file)"); - case ET_DYN: return _("DYN (Shared object file)"); - case ET_CORE: return _("CORE (Core file)"); + case ET_EXEC: return _("EXEC (Executable file)"); + case ET_DYN: return _("DYN (Shared object file)"); + case ET_CORE: return _("CORE (Core file)"); default: if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC)) @@ -3860,7 +3858,7 @@ process_section_groups (FILE *file) error (_("Bad sh_info in group section `%s'\n"), name); continue; } - + group_name = SECTION_NAME (section_headers + sec_index); strtab = NULL; } @@ -3886,8 +3884,8 @@ process_section_groups (FILE *file) if (do_section_groups) { printf ("\n%s group section `%s' [%s] contains %u sections:\n", - get_group_flags (entry), name, group_name, size); - + get_group_flags (entry), name, group_name, size); + printf (_(" [Index] Name\n")); } @@ -3916,8 +3914,8 @@ process_section_groups (FILE *file) sec = SECTION_HEADER (entry); printf (" [%5u] %s\n", entry, SECTION_NAME (sec)); - } - + } + g = xmalloc (sizeof (struct group_list)); g->section_index = entry; g->next = group->root; @@ -4665,9 +4663,19 @@ get_32bit_dynamic_section (FILE *file) if (!edyn) return 0; - dynamic_nent = dynamic_size / sizeof (*ext); - dynamic_section = malloc (dynamic_nent * sizeof (*entry)); +/* SGI's ELF has more than one section in the DYNAMIC segment, and we + might not have the luxury of section headers. Look for the DT_NULL + terminator to determine the number of entries. */ + for (ext = edyn, dynamic_nent = 0; + (char *) ext < (char *) edyn + dynamic_size; + ext++) + { + dynamic_nent++; + if (BYTE_GET (ext->d_tag) == DT_NULL) + break; + } + dynamic_section = malloc (dynamic_nent * sizeof (*entry)); if (dynamic_section == NULL) { error (_("Out of memory\n")); @@ -4676,7 +4684,7 @@ get_32bit_dynamic_section (FILE *file) } for (ext = edyn, entry = dynamic_section; - (char *) ext < (char *) edyn + dynamic_size; + entry < dynamic_section + dynamic_nent; ext++, entry++) { entry->d_tag = BYTE_GET (ext->d_tag); @@ -4699,9 +4707,19 @@ get_64bit_dynamic_section (FILE *file) if (!edyn) return 0; - dynamic_nent = dynamic_size / sizeof (*ext); - dynamic_section = malloc (dynamic_nent * sizeof (*entry)); +/* SGI's ELF has more than one section in the DYNAMIC segment, and we + might not have the luxury of section headers. Look for the DT_NULL + terminator to determine the number of entries. */ + for (ext = edyn, dynamic_nent = 0; + (char *) ext < (char *) edyn + dynamic_size; + ext++) + { + dynamic_nent++; + if (BYTE_GET8 (ext->d_tag) == DT_NULL) + break; + } + dynamic_section = malloc (dynamic_nent * sizeof (*entry)); if (dynamic_section == NULL) { error (_("Out of memory\n")); @@ -4710,7 +4728,7 @@ get_64bit_dynamic_section (FILE *file) } for (ext = edyn, entry = dynamic_section; - (char *) ext < (char *) edyn + dynamic_size; + entry < dynamic_section + dynamic_nent; ext++, entry++) { entry->d_tag = BYTE_GET8 (ext->d_tag); @@ -7108,9 +7126,9 @@ get_TAG_name (unsigned long tag) case DW_TAG_partial_unit: return "DW_TAG_partial_unit"; case DW_TAG_imported_unit: return "DW_TAG_imported_unit"; /* UPC values. */ - case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type"; - case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type"; - case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type"; + case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type"; + case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type"; + case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type"; default: { static char buffer[100]; @@ -8136,7 +8154,7 @@ read_and_display_attr_value (unsigned long attribute, data += offset_size; } else - { + { error (_("Internal error: DWARF version is not 2 or 3.\n")); } break; @@ -8711,7 +8729,7 @@ display_debug_aranges (Elf_Internal_Shdr *section, initial_length_size = 12; } else - { + { offset_size = 4; initial_length_size = 4; } @@ -9155,7 +9173,7 @@ display_debug_frames (Elf_Internal_Shdr *section, unsigned long i; printf (" Augmentation data: "); for (i = 0; i < augmentation_data_len; ++i) - printf (" %02x", augmentation_data[i]); + printf (" %02x", augmentation_data[i]); putchar ('\n'); putchar ('\n'); } @@ -9185,7 +9203,7 @@ display_debug_frames (Elf_Internal_Shdr *section, op &= 0xc0; /* Warning: if you add any more cases to this switch, be - sure to add them to the corresponding switch below. */ + sure to add them to the corresponding switch below. */ switch (op) { case DW_CFA_advance_loc: @@ -9286,7 +9304,7 @@ display_debug_frames (Elf_Internal_Shdr *section, } /* Now we know what registers are used, make a second pass over - the chunk, this time actually printing out the info. */ + the chunk, this time actually printing out the info. */ while (start < block_end) { |