]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - binutils/readelf.c
Do not complain when copying a file format that does not support relocations.
[thirdparty/binutils-gdb.git] / binutils / readelf.c
index f5a8824faf5229610451807f885ed74397112821..9a881069d5ef166c76ed92606586774f9d475f43 100644 (file)
 #include "elf/iq2000.h"
 #include "elf/xtensa.h"
 
+#include "aout/ar.h"
+
 #include "bucomm.h"
 #include "getopt.h"
 #include "libiberty.h"
 
 char *program_name = "readelf";
+long archive_file_offset;
+unsigned long archive_file_size;
 unsigned long dynamic_addr;
 bfd_size_type dynamic_size;
 char *dynamic_strings;
@@ -162,240 +166,8 @@ typedef enum print_mode
 }
 print_mode;
 
-/* Forward declarations for dumb compilers.  */
-static void print_vma
-  PARAMS ((bfd_vma, print_mode));
-static void print_symbol
-  PARAMS ((int, const char *));
-static bfd_vma (*byte_get)
-  PARAMS ((unsigned char *, int));
-static bfd_vma byte_get_little_endian
-  PARAMS ((unsigned char *, int));
-static bfd_vma byte_get_big_endian
-  PARAMS ((unsigned char *, int));
-static bfd_vma byte_get_signed
-  PARAMS ((unsigned char *, int));
-static void (*byte_put)
-  PARAMS ((unsigned char *, bfd_vma, int));
-static void byte_put_little_endian
-  PARAMS ((unsigned char *, bfd_vma, int));
-static void byte_put_big_endian
-  PARAMS ((unsigned char *, bfd_vma, int));
-static const char *get_mips_dynamic_type
-  PARAMS ((unsigned long));
-static const char *get_sparc64_dynamic_type
-  PARAMS ((unsigned long));
-static const char *get_ppc64_dynamic_type
-  PARAMS ((unsigned long));
-static const char *get_parisc_dynamic_type
-  PARAMS ((unsigned long));
-static const char *get_ia64_dynamic_type
-  PARAMS ((unsigned long));
-static const char *get_dynamic_type
-  PARAMS ((unsigned long));
-static int slurp_rela_relocs
-  PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
-          unsigned long *));
-static int slurp_rel_relocs
-  PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
-          unsigned long *));
-static int dump_relocations
-  PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *,
-          unsigned long, char *, int));
-static char *get_file_type
-  PARAMS ((unsigned));
-static char *get_machine_name
-  PARAMS ((unsigned));
-static void decode_ARM_machine_flags
-  PARAMS ((unsigned, char[]));
-static char *get_machine_flags
-  PARAMS ((unsigned, unsigned));
-static const char *get_mips_segment_type
-  PARAMS ((unsigned long));
-static const char *get_parisc_segment_type
-  PARAMS ((unsigned long));
-static const char *get_ia64_segment_type
-  PARAMS ((unsigned long));
-static const char *get_segment_type
-  PARAMS ((unsigned long));
-static const char *get_mips_section_type_name
-  PARAMS ((unsigned int));
-static const char *get_parisc_section_type_name
-  PARAMS ((unsigned int));
-static const char *get_ia64_section_type_name
-  PARAMS ((unsigned int));
-static const char *get_section_type_name
-  PARAMS ((unsigned int));
-static const char *get_symbol_binding
-  PARAMS ((unsigned int));
-static const char *get_symbol_type
-  PARAMS ((unsigned int));
-static const char *get_symbol_visibility
-  PARAMS ((unsigned int));
-static const char *get_symbol_index_type
-  PARAMS ((unsigned int));
-static const char *get_dynamic_flags
-  PARAMS ((bfd_vma));
-static void usage
-  PARAMS ((void));
-static void parse_args
-  PARAMS ((int, char **));
-static int process_file_header
-  PARAMS ((void));
-static int process_program_headers
-  PARAMS ((FILE *));
-static int process_section_headers
-  PARAMS ((FILE *));
-static int process_unwind
-  PARAMS ((FILE *));
-static void dynamic_segment_mips_val
-  PARAMS ((Elf_Internal_Dyn *));
-static void dynamic_segment_parisc_val
-  PARAMS ((Elf_Internal_Dyn *));
-static void dynamic_segment_ia64_val
-  PARAMS ((Elf_Internal_Dyn *));
-static int process_dynamic_segment
-  PARAMS ((FILE *));
-static int process_symbol_table
-  PARAMS ((FILE *));
-static int process_syminfo
-  PARAMS ((FILE *));
-static int process_section_contents
-  PARAMS ((FILE *));
-static void process_mips_fpe_exception
-  PARAMS ((int));
-static int process_mips_specific
-  PARAMS ((FILE *));
-static int process_file
-  PARAMS ((char *));
-static int process_relocs
-  PARAMS ((FILE *));
-static int process_version_sections
-  PARAMS ((FILE *));
-static char *get_ver_flags
-  PARAMS ((unsigned int));
-static int get_32bit_section_headers
-  PARAMS ((FILE *, unsigned int));
-static int get_64bit_section_headers
-  PARAMS ((FILE *, unsigned int));
-static int get_32bit_program_headers
-  PARAMS ((FILE *, Elf_Internal_Phdr *));
-static int get_64bit_program_headers
-  PARAMS ((FILE *, Elf_Internal_Phdr *));
-static int get_program_headers
-  PARAMS ((FILE *));
-static int get_file_header
-  PARAMS ((FILE *));
-static Elf_Internal_Sym *get_32bit_elf_symbols
-  PARAMS ((FILE *, Elf_Internal_Shdr *));
-static Elf_Internal_Sym *get_64bit_elf_symbols
-  PARAMS ((FILE *, Elf_Internal_Shdr *));
-static const char *get_elf_section_flags
-  PARAMS ((bfd_vma));
-static int *get_dynamic_data
-  PARAMS ((FILE *, unsigned int));
-static int get_32bit_dynamic_segment
-  PARAMS ((FILE *));
-static int get_64bit_dynamic_segment
-  PARAMS ((FILE *));
-static long offset_from_vma
-  PARAMS ((FILE *, bfd_vma vma, bfd_size_type size));
-#ifdef SUPPORT_DISASSEMBLY
-static int disassemble_section
-  PARAMS ((Elf_Internal_Shdr *, FILE *));
-#endif
-static int dump_section
-  PARAMS ((Elf_Internal_Shdr *, FILE *));
-static int display_debug_section
-  PARAMS ((Elf_Internal_Shdr *, FILE *));
-static int display_debug_info
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_not_supported
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int prescan_debug_info
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_lines
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_pubnames
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_abbrev
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_aranges
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_frames
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_macinfo
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_str
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static int display_debug_loc
-  PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-static unsigned char *process_abbrev_section
-  PARAMS ((unsigned char *, unsigned char *));
-static void load_debug_str
-  PARAMS ((FILE *));
-static void free_debug_str
-  PARAMS ((void));
-static const char *fetch_indirect_string
-  PARAMS ((unsigned long));
-static void load_debug_loc
-  PARAMS ((FILE *));
-static void free_debug_loc
-  PARAMS ((void));
-static unsigned long read_leb128
-  PARAMS ((unsigned char *, int *, int));
-static int process_extended_line_op
-  PARAMS ((unsigned char *, int, int));
-static void reset_state_machine
-  PARAMS ((int));
-static char *get_TAG_name
-  PARAMS ((unsigned long));
-static char *get_AT_name
-  PARAMS ((unsigned long));
-static char *get_FORM_name
-  PARAMS ((unsigned long));
-static void free_abbrevs
-  PARAMS ((void));
-static void add_abbrev
-  PARAMS ((unsigned long, unsigned long, int));
-static void add_abbrev_attr
-  PARAMS ((unsigned long, unsigned long));
-static unsigned char *read_and_display_attr
-  PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
-          unsigned long, unsigned long, int));
-static unsigned char *read_and_display_attr_value
-  PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
-          unsigned long, unsigned long, int));
-static unsigned char *display_block
-  PARAMS ((unsigned char *, unsigned long));
-static void decode_location_expression
-  PARAMS ((unsigned char *, unsigned int, unsigned long));
-static void request_dump
-  PARAMS ((unsigned int, int));
-static const char *get_elf_class
-  PARAMS ((unsigned int));
-static const char *get_data_encoding
-  PARAMS ((unsigned int));
-static const char *get_osabi_name
-  PARAMS ((unsigned int));
-static int guess_is_rela
-  PARAMS ((unsigned long));
-static const char *get_note_type
-  PARAMS ((unsigned int));
-static const char *get_netbsd_elfcore_note_type
-  PARAMS ((unsigned int));
-static int process_note
-  PARAMS ((Elf_Internal_Note *));
-static int process_corefile_note_segment
-  PARAMS ((FILE *, bfd_vma, bfd_vma));
-static int process_corefile_note_segments
-  PARAMS ((FILE *));
-static int process_corefile_contents
-  PARAMS ((FILE *));
-static int process_arch_specific
-  PARAMS ((FILE *));
-static int process_gnu_liblist
-  PARAMS ((FILE *));
+static bfd_vma (*byte_get) (unsigned char *, int);
+static void (*byte_put) (unsigned char *, bfd_vma, int);
 
 typedef int Elf32_Word;
 
@@ -447,56 +219,50 @@ typedef int Elf32_Word;
 
 
 static void
-error VPARAMS ((const char *message, ...))
+error (const char *message, ...)
 {
-  VA_OPEN (args, message);
-  VA_FIXEDARG (args, const char *, message);
+  va_list args;
 
+  va_start (args, message);
   fprintf (stderr, _("%s: Error: "), program_name);
   vfprintf (stderr, message, args);
-  VA_CLOSE (args);
+  va_end (args);
 }
 
 static void
-warn VPARAMS ((const char *message, ...))
+warn (const char *message, ...)
 {
-  VA_OPEN (args, message);
-  VA_FIXEDARG (args, const char *, message);
+  va_list args;
 
+  va_start (args, message);
   fprintf (stderr, _("%s: Warning: "), program_name);
   vfprintf (stderr, message, args);
-  VA_CLOSE (args);
+  va_end (args);
 }
 
-static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
-
-static PTR
-get_data (var, file, offset, size, reason)
-     PTR var;
-     FILE *file;
-     long offset;
-     size_t size;
-     const char *reason;
+static void *
+get_data (void *var, FILE *file, long offset, size_t size, const char *reason)
 {
-  PTR mvar;
+  void *mvar;
 
   if (size == 0)
     return NULL;
 
-  if (fseek (file, offset, SEEK_SET))
+  if (fseek (file, archive_file_offset + offset, SEEK_SET))
     {
-      error (_("Unable to seek to %x for %s\n"), offset, reason);
+      error (_("Unable to seek to 0x%x for %s\n"),
+            archive_file_offset + offset, reason);
       return NULL;
     }
 
   mvar = var;
   if (mvar == NULL)
     {
-      mvar = (PTR) malloc (size);
+      mvar = malloc (size);
 
       if (mvar == NULL)
        {
-         error (_("Out of memory allocating %d bytes for %s\n"),
+         error (_("Out of memory allocating 0x%x bytes for %s\n"),
                 size, reason);
          return NULL;
        }
@@ -504,7 +270,7 @@ get_data (var, file, offset, size, reason)
 
   if (fread (mvar, size, 1, file) != 1)
     {
-      error (_("Unable to read in %d bytes of %s\n"), size, reason);
+      error (_("Unable to read in 0x%x bytes of %s\n"), size, reason);
       if (mvar != var)
        free (mvar);
       return NULL;
@@ -514,9 +280,7 @@ get_data (var, file, offset, size, reason)
 }
 
 static bfd_vma
-byte_get_little_endian (field, size)
-     unsigned char *field;
-     int size;
+byte_get_little_endian (unsigned char *field, int size)
 {
   switch (size)
     {
@@ -563,9 +327,7 @@ byte_get_little_endian (field, size)
 }
 
 static bfd_vma
-byte_get_signed (field, size)
-     unsigned char *field;
-     int size;
+byte_get_signed (unsigned char *field, int size)
 {
   bfd_vma x = byte_get (field, size);
 
@@ -586,10 +348,7 @@ byte_get_signed (field, size)
 }
 
 static void
-byte_put_little_endian (field, value, size)
-     unsigned char * field;
-     bfd_vma        value;
-     int             size;
+byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
 {
   switch (size)
     {
@@ -618,9 +377,7 @@ byte_put_little_endian (field, value, size)
 
 /* Print a VMA value.  */
 static void
-print_vma (vma, mode)
-     bfd_vma vma;
-     print_mode mode;
+print_vma (bfd_vma vma, print_mode mode)
 {
 #ifdef BFD64
   if (is_32bit_elf)
@@ -738,9 +495,7 @@ print_vma (vma, mode)
    truncating or padding as necessary.  */
 
 static void
-print_symbol (width, symbol)
-     int width;
-     const char *symbol;
+print_symbol (int width, const char *symbol)
 {
   if (do_wide)
     printf ("%s", symbol);
@@ -751,9 +506,7 @@ print_symbol (width, symbol)
 }
 
 static bfd_vma
-byte_get_big_endian (field, size)
-     unsigned char *field;
-     int size;
+byte_get_big_endian (unsigned char *field, int size)
 {
   switch (size)
     {
@@ -801,10 +554,7 @@ byte_get_big_endian (field, size)
 }
 
 static void
-byte_put_big_endian (field, value, size)
-     unsigned char * field;
-     bfd_vma        value;
-     int             size;
+byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
 {
   switch (size)
     {
@@ -838,8 +588,7 @@ byte_put_big_endian (field, value, size)
 /* Guess the relocation size commonly used by the specific machines.  */
 
 static int
-guess_is_rela (e_machine)
-     unsigned long e_machine;
+guess_is_rela (unsigned long e_machine)
 {
   switch (e_machine)
     {
@@ -927,12 +676,11 @@ guess_is_rela (e_machine)
 }
 
 static int
-slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
-     FILE *file;
-     unsigned long rel_offset;
-     unsigned long rel_size;
-     Elf_Internal_Rela **relasp;
-     unsigned long *nrelasp;
+slurp_rela_relocs (FILE *file,
+                  unsigned long rel_offset,
+                  unsigned long rel_size,
+                  Elf_Internal_Rela **relasp,
+                  unsigned long *nrelasp)
 {
   Elf_Internal_Rela *relas;
   unsigned long nrelas;
@@ -942,15 +690,13 @@ slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
     {
       Elf32_External_Rela *erelas;
 
-      erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
-                                                rel_size, _("relocs"));
+      erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
       if (!erelas)
        return 0;
 
       nrelas = rel_size / sizeof (Elf32_External_Rela);
 
-      relas = (Elf_Internal_Rela *)
-       malloc (nrelas * sizeof (Elf_Internal_Rela));
+      relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
 
       if (relas == NULL)
        {
@@ -971,15 +717,13 @@ slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
     {
       Elf64_External_Rela *erelas;
 
-      erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
-                                                rel_size, _("relocs"));
+      erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
       if (!erelas)
        return 0;
 
       nrelas = rel_size / sizeof (Elf64_External_Rela);
 
-      relas = (Elf_Internal_Rela *)
-       malloc (nrelas * sizeof (Elf_Internal_Rela));
+      relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
 
       if (relas == NULL)
        {
@@ -1002,12 +746,11 @@ slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
 }
 
 static int
-slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
-     FILE *file;
-     unsigned long rel_offset;
-     unsigned long rel_size;
-     Elf_Internal_Rela **relsp;
-     unsigned long *nrelsp;
+slurp_rel_relocs (FILE *file,
+                 unsigned long rel_offset,
+                 unsigned long rel_size,
+                 Elf_Internal_Rela **relsp,
+                 unsigned long *nrelsp)
 {
   Elf_Internal_Rela *rels;
   unsigned long nrels;
@@ -1017,14 +760,13 @@ slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
     {
       Elf32_External_Rel *erels;
 
-      erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
-                                              rel_size, _("relocs"));
+      erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
       if (!erels)
        return 0;
 
       nrels = rel_size / sizeof (Elf32_External_Rel);
 
-      rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
+      rels = malloc (nrels * sizeof (Elf_Internal_Rela));
 
       if (rels == NULL)
        {
@@ -1045,14 +787,13 @@ slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
     {
       Elf64_External_Rel *erels;
 
-      erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
-                                              rel_size, _("relocs"));
+      erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
       if (!erels)
        return 0;
 
       nrels = rel_size / sizeof (Elf64_External_Rel);
 
-      rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
+      rels = malloc (nrels * sizeof (Elf_Internal_Rela));
 
       if (rels == NULL)
        {
@@ -1074,17 +815,17 @@ slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
   return 1;
 }
 
-/* Display the contents of the relocation data found at the specified offset.  */
+/* Display the contents of the relocation data found at the specified
+   offset.  */
 
 static int
-dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
-     FILE *file;
-     unsigned long rel_offset;
-     unsigned long rel_size;
-     Elf_Internal_Sym *symtab;
-     unsigned long nsyms;
-     char *strtab;
-     int is_rela;
+dump_relocations (FILE *file,
+                 unsigned long rel_offset,
+                 unsigned long rel_size,
+                 Elf_Internal_Sym *symtab,
+                 unsigned long nsyms,
+                 char *strtab,
+                 int is_rela)
 {
   unsigned int i;
   Elf_Internal_Rela *rels;
@@ -1148,8 +889,8 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
       bfd_vma info;
       bfd_vma symtab_index;
       bfd_vma type;
-      bfd_vma type2 = (bfd_vma) NULL;
-      bfd_vma type3 = (bfd_vma) NULL;
+      bfd_vma type2 = 0;
+      bfd_vma type3 = 0;
 
       offset = rels[i].r_offset;
       info   = rels[i].r_info;
@@ -1453,6 +1194,10 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
                        sec_name = "ABS";
                      else if (psym->st_shndx == SHN_COMMON)
                        sec_name = "COMMON";
+                     else if (elf_header.e_machine == EM_IA_64
+                              && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
+                              && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
+                       sec_name = "ANSI_COM";
                      else
                        {
                          sprintf (name_buf, "<section 0x%x>",
@@ -1517,8 +1262,7 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
 }
 
 static const char *
-get_mips_dynamic_type (type)
-     unsigned long type;
+get_mips_dynamic_type (unsigned long type)
 {
   switch (type)
     {
@@ -1571,8 +1315,7 @@ get_mips_dynamic_type (type)
 }
 
 static const char *
-get_sparc64_dynamic_type (type)
-     unsigned long type;
+get_sparc64_dynamic_type (unsigned long type)
 {
   switch (type)
     {
@@ -1583,8 +1326,7 @@ get_sparc64_dynamic_type (type)
 }
 
 static const char *
-get_ppc64_dynamic_type (type)
-     unsigned long type;
+get_ppc64_dynamic_type (unsigned long type)
 {
   switch (type)
     {
@@ -1597,8 +1339,7 @@ get_ppc64_dynamic_type (type)
 }
 
 static const char *
-get_parisc_dynamic_type (type)
-     unsigned long type;
+get_parisc_dynamic_type (unsigned long type)
 {
   switch (type)
     {
@@ -1621,8 +1362,7 @@ get_parisc_dynamic_type (type)
 }
 
 static const char *
-get_ia64_dynamic_type (type)
-     unsigned long type;
+get_ia64_dynamic_type (unsigned long type)
 {
   switch (type)
     {
@@ -1633,8 +1373,7 @@ get_ia64_dynamic_type (type)
 }
 
 static const char *
-get_dynamic_type (type)
-     unsigned long type;
+get_dynamic_type (unsigned long type)
 {
   static char buff[32];
 
@@ -1769,8 +1508,7 @@ get_dynamic_type (type)
 }
 
 static char *
-get_file_type (e_type)
-     unsigned e_type;
+get_file_type (unsigned e_type)
 {
   static char buff[32];
 
@@ -1794,8 +1532,7 @@ get_file_type (e_type)
 }
 
 static char *
-get_machine_name (e_machine)
-     unsigned e_machine;
+get_machine_name (unsigned e_machine)
 {
   static char buff[64]; /* XXX */
 
@@ -1901,9 +1638,7 @@ get_machine_name (e_machine)
 }
 
 static void
-decode_ARM_machine_flags (e_flags, buf)
-     unsigned e_flags;
-     char buf[];
+decode_ARM_machine_flags (unsigned e_flags, char buf[])
 {
   unsigned eabi;
   int unknown = 0;
@@ -2047,9 +1782,7 @@ decode_ARM_machine_flags (e_flags, buf)
 }
 
 static char *
-get_machine_flags (e_flags, e_machine)
-     unsigned e_flags;
-     unsigned e_machine;
+get_machine_flags (unsigned e_flags, unsigned e_machine)
 {
   static char buf[1024];
 
@@ -2088,6 +1821,9 @@ get_machine_flags (e_flags, e_machine)
        case EM_CYGNUS_V850:
          switch (e_flags & EF_V850_ARCH)
            {
+           case E_V850E1_ARCH:
+             strcat (buf, ", v850e1");
+             break;
            case E_V850E_ARCH:
              strcat (buf, ", v850e");
              break;
@@ -2180,6 +1916,7 @@ get_machine_flags (e_flags, e_machine)
            case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
            case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
            case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
+           case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
            default: strcat (buf, ", unknown ISA"); break;
            }
 
@@ -2279,8 +2016,37 @@ get_machine_flags (e_flags, e_machine)
 }
 
 static const char *
-get_mips_segment_type (type)
-     unsigned long type;
+get_osabi_name (unsigned int osabi)
+{
+  static char buff[32];
+
+  switch (osabi)
+    {
+    case ELFOSABI_NONE:                return "UNIX - System V";
+    case ELFOSABI_HPUX:                return "UNIX - HP-UX";
+    case ELFOSABI_NETBSD:      return "UNIX - NetBSD";
+    case ELFOSABI_LINUX:       return "UNIX - Linux";
+    case ELFOSABI_HURD:                return "GNU/Hurd";
+    case ELFOSABI_SOLARIS:     return "UNIX - Solaris";
+    case ELFOSABI_AIX:         return "UNIX - AIX";
+    case ELFOSABI_IRIX:                return "UNIX - IRIX";
+    case ELFOSABI_FREEBSD:     return "UNIX - FreeBSD";
+    case ELFOSABI_TRU64:       return "UNIX - TRU64";
+    case ELFOSABI_MODESTO:     return "Novell - Modesto";
+    case ELFOSABI_OPENBSD:     return "UNIX - OpenBSD";
+    case ELFOSABI_OPENVMS:     return "VMS - OpenVMS";
+    case ELFOSABI_NSK:         return "HP - Non-Stop Kernel";
+    case ELFOSABI_AROS:                return "Amiga Research OS";
+    case ELFOSABI_STANDALONE:  return _("Standalone App");
+    case ELFOSABI_ARM:         return "ARM";
+    default:
+      sprintf (buff, _("<unknown: %x>"), osabi);
+      return buff;
+    }
+}
+
+static const char *
+get_mips_segment_type (unsigned long type)
 {
   switch (type)
     {
@@ -2298,8 +2064,7 @@ get_mips_segment_type (type)
 }
 
 static const char *
-get_parisc_segment_type (type)
-     unsigned long type;
+get_parisc_segment_type (unsigned long type)
 {
   switch (type)
     {
@@ -2325,8 +2090,7 @@ get_parisc_segment_type (type)
 }
 
 static const char *
-get_ia64_segment_type (type)
-     unsigned long type;
+get_ia64_segment_type (unsigned long type)
 {
   switch (type)
     {
@@ -2344,8 +2108,7 @@ get_ia64_segment_type (type)
 }
 
 static const char *
-get_segment_type (p_type)
-     unsigned long p_type;
+get_segment_type (unsigned long p_type)
 {
   static char buff[32];
 
@@ -2421,8 +2184,7 @@ get_segment_type (p_type)
 }
 
 static const char *
-get_mips_section_type_name (sh_type)
-     unsigned int sh_type;
+get_mips_section_type_name (unsigned int sh_type)
 {
   switch (sh_type)
     {
@@ -2472,8 +2234,7 @@ get_mips_section_type_name (sh_type)
 }
 
 static const char *
-get_parisc_section_type_name (sh_type)
-     unsigned int sh_type;
+get_parisc_section_type_name (unsigned int sh_type)
 {
   switch (sh_type)
     {
@@ -2487,8 +2248,7 @@ get_parisc_section_type_name (sh_type)
 }
 
 static const char *
-get_ia64_section_type_name (sh_type)
-     unsigned int sh_type;
+get_ia64_section_type_name (unsigned int sh_type)
 {
   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
@@ -2506,8 +2266,7 @@ get_ia64_section_type_name (sh_type)
 }
 
 static const char *
-get_section_type_name (sh_type)
-     unsigned int sh_type;
+get_section_type_name (unsigned int sh_type)
 {
   static char buff[32];
 
@@ -2611,7 +2370,7 @@ struct option options[] =
 };
 
 static void
-usage ()
+usage (void)
 {
   fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
   fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
@@ -2652,15 +2411,13 @@ usage ()
 }
 
 static void
-request_dump (section, type)
-     unsigned int section;
-     int type;
+request_dump (unsigned int section, int type)
 {
   if (section >= num_dump_sects)
     {
       char *new_dump_sects;
 
-      new_dump_sects = (char *) calloc (section + 1, 1);
+      new_dump_sects = calloc (section + 1, 1);
 
       if (new_dump_sects == NULL)
        error (_("Out of memory allocating dump request table."));
@@ -2683,9 +2440,7 @@ request_dump (section, type)
 }
 
 static void
-parse_args (argc, argv)
-     int argc;
-     char **argv;
+parse_args (int argc, char **argv)
 {
   int c;
 
@@ -2956,8 +2711,7 @@ parse_args (argc, argv)
 }
 
 static const char *
-get_elf_class (elf_class)
-     unsigned int elf_class;
+get_elf_class (unsigned int elf_class)
 {
   static char buff[32];
 
@@ -2973,8 +2727,7 @@ get_elf_class (elf_class)
 }
 
 static const char *
-get_data_encoding (encoding)
-     unsigned int encoding;
+get_data_encoding (unsigned int encoding)
 {
   static char buff[32];
 
@@ -2989,41 +2742,10 @@ get_data_encoding (encoding)
     }
 }
 
-static const char *
-get_osabi_name (osabi)
-     unsigned int osabi;
-{
-  static char buff[32];
-
-  switch (osabi)
-    {
-    case ELFOSABI_NONE:                return "UNIX - System V";
-    case ELFOSABI_HPUX:                return "UNIX - HP-UX";
-    case ELFOSABI_NETBSD:      return "UNIX - NetBSD";
-    case ELFOSABI_LINUX:       return "UNIX - Linux";
-    case ELFOSABI_HURD:                return "GNU/Hurd";
-    case ELFOSABI_SOLARIS:     return "UNIX - Solaris";
-    case ELFOSABI_AIX:         return "UNIX - AIX";
-    case ELFOSABI_IRIX:                return "UNIX - IRIX";
-    case ELFOSABI_FREEBSD:     return "UNIX - FreeBSD";
-    case ELFOSABI_TRU64:       return "UNIX - TRU64";
-    case ELFOSABI_MODESTO:     return "Novell - Modesto";
-    case ELFOSABI_OPENBSD:     return "UNIX - OpenBSD";
-    case ELFOSABI_OPENVMS:     return "VMS - OpenVMS";
-    case ELFOSABI_NSK:         return "HP - Non-Stop Kernel";
-    case ELFOSABI_AROS:                return "Amiga Research OS";
-    case ELFOSABI_STANDALONE:  return _("Standalone App");
-    case ELFOSABI_ARM:         return "ARM";
-    default:
-      sprintf (buff, _("<unknown: %x>"), osabi);
-      return buff;
-    }
-}
-
 /* Decode the data held in 'elf_header'.  */
 
 static int
-process_file_header ()
+process_file_header (void)
 {
   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
       || elf_header.e_ident[EI_MAG1] != ELFMAG1
@@ -3112,19 +2834,16 @@ process_file_header ()
 
 
 static int
-get_32bit_program_headers (file, program_headers)
-     FILE *file;
-     Elf_Internal_Phdr *program_headers;
+get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
 {
   Elf32_External_Phdr *phdrs;
   Elf32_External_Phdr *external;
   Elf_Internal_Phdr *internal;
   unsigned int i;
 
-  phdrs = ((Elf32_External_Phdr *)
-          get_data (NULL, file, elf_header.e_phoff,
-                    elf_header.e_phentsize * elf_header.e_phnum,
-                    _("program headers")));
+  phdrs = get_data (NULL, file, elf_header.e_phoff,
+                   elf_header.e_phentsize * elf_header.e_phnum,
+                   _("program headers"));
   if (!phdrs)
     return 0;
 
@@ -3148,19 +2867,16 @@ get_32bit_program_headers (file, program_headers)
 }
 
 static int
-get_64bit_program_headers (file, program_headers)
-     FILE *file;
-     Elf_Internal_Phdr *program_headers;
+get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
 {
   Elf64_External_Phdr *phdrs;
   Elf64_External_Phdr *external;
   Elf_Internal_Phdr *internal;
   unsigned int i;
 
-  phdrs = ((Elf64_External_Phdr *)
-          get_data (NULL, file, elf_header.e_phoff,
-                    elf_header.e_phentsize * elf_header.e_phnum,
-                    _("program headers")));
+  phdrs = get_data (NULL, file, elf_header.e_phoff,
+                   elf_header.e_phentsize * elf_header.e_phnum,
+                   _("program headers"));
   if (!phdrs)
     return 0;
 
@@ -3186,8 +2902,7 @@ get_64bit_program_headers (file, program_headers)
 /* Returns 1 if the program headers were read into `program_headers'.  */
 
 static int
-get_program_headers (file)
-     FILE *file;
+get_program_headers (FILE *file)
 {
   Elf_Internal_Phdr *phdrs;
 
@@ -3195,8 +2910,7 @@ get_program_headers (file)
   if (program_headers != NULL)
     return 1;
 
-  phdrs = (Elf_Internal_Phdr *) malloc
-    (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
+  phdrs = malloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
 
   if (phdrs == NULL)
     {
@@ -3219,8 +2933,7 @@ get_program_headers (file)
 /* Returns 1 if the program headers were loaded.  */
 
 static int
-process_program_headers (file)
-     FILE *file;
+process_program_headers (FILE *file)
 {
   Elf_Internal_Phdr *segment;
   unsigned int i;
@@ -3364,7 +3077,8 @@ process_program_headers (file)
          break;
 
        case PT_INTERP:
-         if (fseek (file, (long) segment->p_offset, SEEK_SET))
+         if (fseek (file, archive_file_offset + (long) segment->p_offset,
+                    SEEK_SET))
            error (_("Unable to find program interpreter name\n"));
          else
            {
@@ -3425,10 +3139,7 @@ process_program_headers (file)
 /* Find the file offset corresponding to VMA by using the program headers.  */
 
 static long
-offset_from_vma (file, vma, size)
-     FILE *file;
-     bfd_vma vma;
-     bfd_size_type size;
+offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
 {
   Elf_Internal_Phdr *seg;
 
@@ -3457,23 +3168,18 @@ offset_from_vma (file, vma, size)
 
 
 static int
-get_32bit_section_headers (file, num)
-     FILE *file;
-     unsigned int num;
+get_32bit_section_headers (FILE *file, unsigned int num)
 {
   Elf32_External_Shdr *shdrs;
   Elf_Internal_Shdr *internal;
   unsigned int i;
 
-  shdrs = ((Elf32_External_Shdr *)
-          get_data (NULL, file, elf_header.e_shoff,
-                    elf_header.e_shentsize * num,
-                    _("section headers")));
+  shdrs = get_data (NULL, file, elf_header.e_shoff,
+                   elf_header.e_shentsize * num, _("section headers"));
   if (!shdrs)
     return 0;
 
-  section_headers = ((Elf_Internal_Shdr *)
-                    malloc (num * sizeof (Elf_Internal_Shdr)));
+  section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
 
   if (section_headers == NULL)
     {
@@ -3503,23 +3209,18 @@ get_32bit_section_headers (file, num)
 }
 
 static int
-get_64bit_section_headers (file, num)
-     FILE *file;
-     unsigned int num;
+get_64bit_section_headers (FILE *file, unsigned int num)
 {
   Elf64_External_Shdr *shdrs;
   Elf_Internal_Shdr *internal;
   unsigned int i;
 
-  shdrs = ((Elf64_External_Shdr *)
-          get_data (NULL, file, elf_header.e_shoff,
-                    elf_header.e_shentsize * num,
-                    _("section headers")));
+  shdrs = get_data (NULL, file, elf_header.e_shoff,
+                   elf_header.e_shentsize * num, _("section headers"));
   if (!shdrs)
     return 0;
 
-  section_headers = ((Elf_Internal_Shdr *)
-                    malloc (num * sizeof (Elf_Internal_Shdr)));
+  section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
 
   if (section_headers == NULL)
     {
@@ -3549,9 +3250,7 @@ get_64bit_section_headers (file, num)
 }
 
 static Elf_Internal_Sym *
-get_32bit_elf_symbols (file, section)
-     FILE *file;
-     Elf_Internal_Shdr *section;
+get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
 {
   unsigned long number;
   Elf32_External_Sym *esyms;
@@ -3560,9 +3259,8 @@ get_32bit_elf_symbols (file, section)
   Elf_Internal_Sym *psym;
   unsigned int j;
 
-  esyms = ((Elf32_External_Sym *)
-          get_data (NULL, file, section->sh_offset,
-                    section->sh_size, _("symbols")));
+  esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
+                   _("symbols"));
   if (!esyms)
     return NULL;
 
@@ -3571,9 +3269,8 @@ get_32bit_elf_symbols (file, section)
       && (symtab_shndx_hdr->sh_link
          == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
     {
-      shndx = ((Elf_External_Sym_Shndx *)
-              get_data (NULL, file, symtab_shndx_hdr->sh_offset,
-                        symtab_shndx_hdr->sh_size, _("symtab shndx")));
+      shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
+                       symtab_shndx_hdr->sh_size, _("symtab shndx"));
       if (!shndx)
        {
          free (esyms);
@@ -3582,7 +3279,7 @@ get_32bit_elf_symbols (file, section)
     }
 
   number = section->sh_size / section->sh_entsize;
-  isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
+  isyms = malloc (number * sizeof (Elf_Internal_Sym));
 
   if (isyms == NULL)
     {
@@ -3616,9 +3313,7 @@ get_32bit_elf_symbols (file, section)
 }
 
 static Elf_Internal_Sym *
-get_64bit_elf_symbols (file, section)
-     FILE *file;
-     Elf_Internal_Shdr *section;
+get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
 {
   unsigned long number;
   Elf64_External_Sym *esyms;
@@ -3627,9 +3322,8 @@ get_64bit_elf_symbols (file, section)
   Elf_Internal_Sym *psym;
   unsigned int j;
 
-  esyms = ((Elf64_External_Sym *)
-          get_data (NULL, file, section->sh_offset,
-                    section->sh_size, _("symbols")));
+  esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
+                   _("symbols"));
   if (!esyms)
     return NULL;
 
@@ -3638,9 +3332,8 @@ get_64bit_elf_symbols (file, section)
       && (symtab_shndx_hdr->sh_link
          == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
     {
-      shndx = ((Elf_External_Sym_Shndx *)
-              get_data (NULL, file, symtab_shndx_hdr->sh_offset,
-                        symtab_shndx_hdr->sh_size, _("symtab shndx")));
+      shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
+                       symtab_shndx_hdr->sh_size, _("symtab shndx"));
       if (!shndx)
        {
          free (esyms);
@@ -3649,7 +3342,7 @@ get_64bit_elf_symbols (file, section)
     }
 
   number = section->sh_size / section->sh_entsize;
-  isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
+  isyms = malloc (number * sizeof (Elf_Internal_Sym));
 
   if (isyms == NULL)
     {
@@ -3683,8 +3376,7 @@ get_64bit_elf_symbols (file, section)
 }
 
 static const char *
-get_elf_section_flags (sh_flags)
-     bfd_vma sh_flags;
+get_elf_section_flags (bfd_vma sh_flags)
 {
   static char buff[32];
 
@@ -3731,8 +3423,7 @@ get_elf_section_flags (sh_flags)
 }
 
 static int
-process_section_headers (file)
-     FILE *file;
+process_section_headers (FILE *file)
 {
   Elf_Internal_Shdr *section;
   unsigned int i;
@@ -3764,9 +3455,12 @@ process_section_headers (file)
 
   if (section->sh_size != 0)
     {
-      string_table = (char *) get_data (NULL, file, section->sh_offset,
-                                       section->sh_size, _("string table"));
+      string_table = get_data (NULL, file, section->sh_offset,
+                              section->sh_size, _("string table"));
 
+      if (string_table == NULL)
+       return 0;
+      
       string_table_length = section->sh_size;
     }
 
@@ -3803,9 +3497,8 @@ process_section_headers (file)
              continue;
            }
 
-         dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
-                                              section->sh_size,
-                                              _("dynamic strings"));
+         dynamic_strings = get_data (NULL, file, section->sh_offset,
+                                     section->sh_size, _("dynamic strings"));
        }
       else if (section->sh_type == SHT_SYMTAB_SHNDX)
        {
@@ -3980,8 +3673,7 @@ struct
 
 /* Process the reloc section.  */
 static int
-process_relocs (file)
-     FILE *file;
+process_relocs (FILE *file)
 {
   unsigned long rel_size;
   unsigned long rel_offset;
@@ -4090,9 +3782,8 @@ process_relocs (file)
 
                  strsec = SECTION_HEADER (symsec->sh_link);
 
-                 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
-                                             strsec->sh_size,
-                                             _("string table"));
+                 strtab = get_data (NULL, file, strsec->sh_offset,
+                                    strsec->sh_size, _("string table"));
                }
              is_rela = section->sh_type == SHT_RELA;
 
@@ -4147,21 +3838,13 @@ struct unw_aux_info
     unsigned long strtab_size; /* Size of string table.  */
   };
 
-static void find_symbol_for_address
-  PARAMS ((struct unw_aux_info *, struct absaddr, const char **, bfd_vma *));
-static void dump_ia64_unwind
-  PARAMS ((struct unw_aux_info *));
-static int slurp_ia64_unwind_table
-  PARAMS ((FILE *, struct unw_aux_info *, Elf_Internal_Shdr *));
-
 static void
-find_symbol_for_address (aux, addr, symname, offset)
-     struct unw_aux_info *aux;
-     struct absaddr addr;
-     const char **symname;
-     bfd_vma *offset;
+find_symbol_for_address (struct unw_aux_info *aux,
+                        struct absaddr addr,
+                        const char **symname,
+                        bfd_vma *offset)
 {
-  bfd_vma dist = (bfd_vma) 0x100000;
+  bfd_vma dist = 0x100000;
   Elf_Internal_Sym *sym, *best = NULL;
   unsigned long i;
 
@@ -4191,8 +3874,7 @@ find_symbol_for_address (aux, addr, symname, offset)
 }
 
 static void
-dump_ia64_unwind (aux)
-     struct unw_aux_info *aux;
+dump_ia64_unwind (struct unw_aux_info *aux)
 {
   bfd_vma addr_size;
   struct unw_table_entry *tp;
@@ -4250,10 +3932,9 @@ dump_ia64_unwind (aux)
 }
 
 static int
-slurp_ia64_unwind_table (file, aux, sec)
-     FILE *file;
-     struct unw_aux_info *aux;
-     Elf_Internal_Shdr *sec;
+slurp_ia64_unwind_table (FILE *file,
+                        struct unw_aux_info *aux,
+                        Elf_Internal_Shdr *sec)
 {
   unsigned long size, addr_size, nrelas, i;
   Elf_Internal_Phdr *seg;
@@ -4292,8 +3973,7 @@ slurp_ia64_unwind_table (file, aux, sec)
 
   /* Second, build the unwind table from the contents of the unwind section:  */
   size = sec->sh_size;
-  table = (char *) get_data (NULL, file, sec->sh_offset,
-                            size, _("unwind table"));
+  table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
   if (!table)
     return 0;
 
@@ -4397,8 +4077,7 @@ slurp_ia64_unwind_table (file, aux, sec)
 }
 
 static int
-process_unwind (file)
-     FILE *file;
+process_unwind (FILE *file)
 {
   Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
   unsigned long i, addr_size, unwcount = 0, unwstart = 0;
@@ -4426,8 +4105,8 @@ process_unwind (file)
 
          strsec = SECTION_HEADER (sec->sh_link);
          aux.strtab_size = strsec->sh_size;
-         aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
-                                         aux.strtab_size, _("string table"));
+         aux.strtab = get_data (NULL, file, strsec->sh_offset,
+                                aux.strtab_size, _("string table"));
        }
       else if (sec->sh_type == SHT_IA_64_UNWIND)
        unwcount++;
@@ -4496,8 +4175,8 @@ process_unwind (file)
        {
          aux.info_size = sec->sh_size;
          aux.info_addr = sec->sh_addr;
-         aux.info = (char *) get_data (NULL, file, sec->sh_offset,
-                                       aux.info_size, _("unwind info"));
+         aux.info = get_data (NULL, file, sec->sh_offset, aux.info_size,
+                              _("unwind info"));
 
          printf (_("\nUnwind section "));
 
@@ -4533,8 +4212,7 @@ process_unwind (file)
 }
 
 static void
-dynamic_segment_mips_val (entry)
-     Elf_Internal_Dyn *entry;
+dynamic_segment_mips_val (Elf_Internal_Dyn *entry)
 {
   switch (entry->d_tag)
     {
@@ -4608,8 +4286,7 @@ dynamic_segment_mips_val (entry)
 
 
 static void
-dynamic_segment_parisc_val (entry)
-     Elf_Internal_Dyn *entry;
+dynamic_segment_parisc_val (Elf_Internal_Dyn *entry)
 {
   switch (entry->d_tag)
     {
@@ -4665,30 +4342,33 @@ dynamic_segment_parisc_val (entry)
 }
 
 static void
-dynamic_segment_ia64_val (entry)
-     Elf_Internal_Dyn *entry;
+dynamic_segment_ia64_val (Elf_Internal_Dyn *entry)
 {
   switch (entry->d_tag)
     {
     case DT_IA_64_PLT_RESERVE: 
-      /* First 3 bytes reserved.  */
+      /* First 3 slots reserved.  */
       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
       printf (" -- ");
       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
-      printf ("\n");
+      break;
+
+    default:
+      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
+      break;
     }
+  putchar ('\n');
 }
 
 static int
-get_32bit_dynamic_segment (file)
-     FILE *file;
+get_32bit_dynamic_segment (FILE *file)
 {
   Elf32_External_Dyn *edyn;
   Elf_Internal_Dyn *entry;
   bfd_size_type i;
 
-  edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
-                                         dynamic_size, _("dynamic segment"));
+  edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
+                  _("dynamic segment"));
   if (!edyn)
     return 0;
 
@@ -4699,8 +4379,7 @@ get_32bit_dynamic_segment (file)
   while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
     ;
 
-  dynamic_segment = (Elf_Internal_Dyn *)
-    malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
+  dynamic_segment = malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
 
   if (dynamic_segment == NULL)
     {
@@ -4723,15 +4402,14 @@ get_32bit_dynamic_segment (file)
 }
 
 static int
-get_64bit_dynamic_segment (file)
-     FILE *file;
+get_64bit_dynamic_segment (FILE *file)
 {
   Elf64_External_Dyn *edyn;
   Elf_Internal_Dyn *entry;
   bfd_size_type i;
 
-  edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
-                                         dynamic_size, _("dynamic segment"));
+  edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
+                  _("dynamic segment"));
   if (!edyn)
     return 0;
 
@@ -4742,8 +4420,7 @@ get_64bit_dynamic_segment (file)
   while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
     ;
 
-  dynamic_segment = (Elf_Internal_Dyn *)
-    malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
+  dynamic_segment = malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
 
   if (dynamic_segment == NULL)
     {
@@ -4766,8 +4443,7 @@ get_64bit_dynamic_segment (file)
 }
 
 static const char *
-get_dynamic_flags (flags)
-     bfd_vma flags;
+get_dynamic_flags (bfd_vma flags)
 {
   static char buff[128];
   char *p = buff;
@@ -4800,8 +4476,7 @@ get_dynamic_flags (flags)
 
 /* Parse and display the contents of the dynamic segment.  */
 static int
-process_dynamic_segment (file)
-     FILE *file;
+process_dynamic_segment (FILE *file)
 {
   Elf_Internal_Dyn *entry;
   bfd_size_type i;
@@ -4842,10 +4517,16 @@ process_dynamic_segment (file)
             should work.  */
          section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
 
-         if (fseek (file, 0, SEEK_END))
-           error (_("Unable to seek to end of file!"));
+         if (archive_file_offset != 0)
+           section.sh_size = archive_file_size - section.sh_offset;
+         else
+           {
+             if (fseek (file, 0, SEEK_END))
+               error (_("Unable to seek to end of file!"));
+
+             section.sh_size = ftell (file) - section.sh_offset;
+           }
 
-         section.sh_size = ftell (file) - section.sh_offset;
          if (is_32bit_elf)
            section.sh_entsize = sizeof (Elf32_External_Sym);
          else
@@ -4883,9 +4564,15 @@ process_dynamic_segment (file)
             should work.  */
 
          offset = offset_from_vma (file, entry->d_un.d_val, 0);
-         if (fseek (file, 0, SEEK_END))
-           error (_("Unable to seek to end of file\n"));
-         str_tab_len = ftell (file) - offset;
+
+         if (archive_file_offset != 0)
+           str_tab_len = archive_file_size - offset;
+         else
+           {
+             if (fseek (file, 0, SEEK_END))
+               error (_("Unable to seek to end of file\n"));
+             str_tab_len = ftell (file) - offset;
+           }
 
          if (str_tab_len < 1)
            {
@@ -4894,8 +4581,8 @@ process_dynamic_segment (file)
              continue;
            }
 
-         dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
-                                              _("dynamic string table"));
+         dynamic_strings = get_data (NULL, file, offset, str_tab_len,
+                                     _("dynamic string table"));
          break;
        }
     }
@@ -4928,13 +4615,12 @@ process_dynamic_segment (file)
          Elf_Internal_Syminfo *syminfo;
 
          /* There is a syminfo section.  Read the data.  */
-         extsyminfo = ((Elf_External_Syminfo *)
-                       get_data (NULL, file, dynamic_syminfo_offset,
-                                 syminsz, _("symbol information")));
+         extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, syminsz,
+                                _("symbol information"));
          if (!extsyminfo)
            return 0;
 
-         dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
+         dynamic_syminfo = malloc (syminsz);
          if (dynamic_syminfo == NULL)
            {
              error (_("Out of memory\n"));
@@ -5347,8 +5033,7 @@ process_dynamic_segment (file)
 }
 
 static char *
-get_ver_flags (flags)
-     unsigned int flags;
+get_ver_flags (unsigned int flags)
 {
   static char buff[32];
 
@@ -5376,8 +5061,7 @@ get_ver_flags (flags)
 
 /* Display the contents of the version sections.  */
 static int
-process_version_sections (file)
-     FILE *file;
+process_version_sections (FILE *file)
 {
   Elf_Internal_Shdr *section;
   unsigned i;
@@ -5410,10 +5094,8 @@ process_version_sections (file)
                    (unsigned long) section->sh_offset, section->sh_link,
                    SECTION_NAME (SECTION_HEADER (section->sh_link)));
 
-           edefs = ((Elf_External_Verdef *)
-                    get_data (NULL, file, section->sh_offset,
-                              section->sh_size,
-                              _("version definition section")));
+           edefs = get_data (NULL, file, section->sh_offset, section->sh_size,
+                             _("version definition section"));
            if (!edefs)
              break;
 
@@ -5501,9 +5183,8 @@ process_version_sections (file)
                    (unsigned long) section->sh_offset, section->sh_link,
                    SECTION_NAME (SECTION_HEADER (section->sh_link)));
 
-           eneed = ((Elf_External_Verneed *)
-                    get_data (NULL, file, section->sh_offset,
-                              section->sh_size, _("version need section")));
+           eneed = get_data (NULL, file, section->sh_offset, section->sh_size,
+                             _("version need section"));
            if (!eneed)
              break;
 
@@ -5550,10 +5231,10 @@ process_version_sections (file)
                    aux.vna_next  = BYTE_GET (eaux->vna_next);
 
                    if (dynamic_strings)
-                     printf (_("  %#06x: Name: %s"),
+                     printf (_("  %#06x:   Name: %s"),
                              isum, dynamic_strings + aux.vna_name);
                    else
-                     printf (_("  %#06x: Name index: %lx"),
+                     printf (_("  %#06x:   Name index: %lx"),
                              isum, aux.vna_name);
 
                    printf (_("  Flags: %s  Version: %d\n"),
@@ -5580,6 +5261,7 @@ process_version_sections (file)
            char *strtab;
            Elf_Internal_Sym *symbols;
            Elf_Internal_Shdr *string_sec;
+           long off;
 
            link_section = SECTION_HEADER (section->sh_link);
            total = section->sh_size / section->sh_entsize;
@@ -5590,9 +5272,8 @@ process_version_sections (file)
 
            string_sec = SECTION_HEADER (link_section->sh_link);
 
-           strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
-                                       string_sec->sh_size,
-                                       _("version string table"));
+           strtab = get_data (NULL, file, string_sec->sh_offset,
+                              string_sec->sh_size, _("version string table"));
            if (!strtab)
              break;
 
@@ -5605,20 +5286,18 @@ process_version_sections (file)
                    (unsigned long) section->sh_offset, section->sh_link,
                    SECTION_NAME (link_section));
 
-           edata =
-             ((unsigned char *)
-              get_data (NULL, file,
-                        offset_from_vma
-                        (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
-                         total * sizeof (short)),
-                        total * sizeof (short), _("version symbol data")));
+           off = offset_from_vma (file,
+                                  version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
+                                  total * sizeof (short));
+           edata = get_data (NULL, file, off, total * sizeof (short),
+                             _("version symbol data"));
            if (!edata)
              {
                free (strtab);
                break;
              }
 
-           data = (unsigned short *) malloc (total * sizeof (short));
+           data = malloc (total * sizeof (short));
 
            for (cnt = total; cnt --;)
              data[cnt] = byte_get (edata + cnt * sizeof (short),
@@ -5786,8 +5465,7 @@ process_version_sections (file)
 }
 
 static const char *
-get_symbol_binding (binding)
-     unsigned int binding;
+get_symbol_binding (unsigned int binding)
 {
   static char buff[32];
 
@@ -5808,8 +5486,7 @@ get_symbol_binding (binding)
 }
 
 static const char *
-get_symbol_type (type)
-     unsigned int type;
+get_symbol_type (unsigned int type)
 {
   static char buff[32];
 
@@ -5855,8 +5532,7 @@ get_symbol_type (type)
 }
 
 static const char *
-get_symbol_visibility (visibility)
-     unsigned int visibility;
+get_symbol_visibility (unsigned int visibility)
 {
   switch (visibility)
     {
@@ -5869,8 +5545,7 @@ get_symbol_visibility (visibility)
 }
 
 static const char *
-get_symbol_index_type (type)
-     unsigned int type;
+get_symbol_index_type (unsigned int type)
 {
   static char buff[32];
 
@@ -5880,7 +5555,11 @@ get_symbol_index_type (type)
     case SHN_ABS:      return "ABS";
     case SHN_COMMON:   return "COM";
     default:
-      if (type >= SHN_LOPROC && type <= SHN_HIPROC)
+      if (type == SHN_IA_64_ANSI_COMMON
+         && elf_header.e_machine == EM_IA_64
+         && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
+       return "ANSI_COM";
+      else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
        sprintf (buff, "PRC[0x%04x]", type);
       else if (type >= SHN_LOOS && type <= SHN_HIOS)
        sprintf (buff, "OS [0x%04x]", type);
@@ -5895,14 +5574,12 @@ get_symbol_index_type (type)
 }
 
 static int *
-get_dynamic_data (file, number)
-     FILE *file;
-     unsigned int number;
+get_dynamic_data (FILE *file, unsigned int number)
 {
   unsigned char *e_data;
   int *i_data;
 
-  e_data = (unsigned char *) malloc (number * 4);
+  e_data = malloc (number * 4);
 
   if (e_data == NULL)
     {
@@ -5916,7 +5593,7 @@ get_dynamic_data (file, number)
       return NULL;
     }
 
-  i_data = (int *) malloc (number * sizeof (*i_data));
+  i_data = malloc (number * sizeof (*i_data));
 
   if (i_data == NULL)
     {
@@ -5935,8 +5612,7 @@ get_dynamic_data (file, number)
 
 /* Dump the symbol table.  */
 static int
-process_symbol_table (file)
-     FILE *file;
+process_symbol_table (FILE *file)
 {
   Elf_Internal_Shdr *section;
   unsigned char nb[4];
@@ -5952,8 +5628,10 @@ process_symbol_table (file)
   if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
                                || do_histogram))
     {
-      if (fseek (file, offset_from_vma (file, dynamic_info[DT_HASH],
-                                       sizeof nb + sizeof nc),
+      if (fseek (file,
+                (archive_file_offset
+                 + offset_from_vma (file, dynamic_info[DT_HASH],
+                                    sizeof nb + sizeof nc)),
                 SEEK_SET))
        {
          error (_("Unable to seek to start of dynamic information"));
@@ -6057,9 +5735,8 @@ process_symbol_table (file)
 
              string_sec = SECTION_HEADER (section->sh_link);
 
-             strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
-                                         string_sec->sh_size,
-                                         _("string table"));
+             strtab = get_data (NULL, file, string_sec->sh_offset,
+                                string_sec->sh_size, _("string table"));
            }
 
          for (si = 0, psym = symtab;
@@ -6235,7 +5912,7 @@ process_symbol_table (file)
              nbuckets);
       printf (_(" Length  Number     %% of total  Coverage\n"));
 
-      lengths = (int *) calloc (nbuckets, sizeof (int));
+      lengths = calloc (nbuckets, sizeof (int));
       if (lengths == NULL)
        {
          error (_("Out of memory"));
@@ -6254,7 +5931,7 @@ process_symbol_table (file)
            }
        }
 
-      counts = (int *) calloc (maxlength + 1, sizeof (int));
+      counts = calloc (maxlength + 1, sizeof (int));
       if (counts == NULL)
        {
          error (_("Out of memory"));
@@ -6291,8 +5968,7 @@ process_symbol_table (file)
 }
 
 static int
-process_syminfo (file)
-     FILE *file ATTRIBUTE_UNUSED;
+process_syminfo (FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned int i;
 
@@ -6358,9 +6034,7 @@ process_syminfo (file)
 
 #ifdef SUPPORT_DISASSEMBLY
 static void
-disassemble_section (section, file)
-     Elf_Internal_Shdr *section;
-     FILE *file;
+disassemble_section (Elf_Internal_Shdr *section, FILE *file)
 {
   printf (_("\nAssembly dump of section %s\n"),
          SECTION_NAME (section));
@@ -6372,9 +6046,7 @@ disassemble_section (section, file)
 #endif
 
 static int
-dump_section (section, file)
-     Elf_Internal_Shdr *section;
-     FILE *file;
+dump_section (Elf_Internal_Shdr *section, FILE *file)
 {
   bfd_size_type bytes;
   bfd_vma addr;
@@ -6394,8 +6066,7 @@ dump_section (section, file)
 
   addr = section->sh_addr;
 
-  start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
-                                     _("section data"));
+  start = get_data (NULL, file, section->sh_offset, bytes, _("section data"));
   if (!start)
     return 0;
 
@@ -6464,10 +6135,7 @@ dump_section (section, file)
 
 
 static unsigned long int
-read_leb128 (data, length_return, sign)
-     unsigned char *data;
-     int *length_return;
-     int sign;
+read_leb128 (unsigned char *data, int *length_return, int sign)
 {
   unsigned long int result = 0;
   unsigned int num_read = 0;
@@ -6512,8 +6180,7 @@ typedef struct State_Machine_Registers
 static SMR state_machine_regs;
 
 static void
-reset_state_machine (is_stmt)
-     int is_stmt;
+reset_state_machine (int is_stmt)
 {
   state_machine_regs.address = 0;
   state_machine_regs.file = 1;
@@ -6528,10 +6195,7 @@ reset_state_machine (is_stmt)
 /* Handled an extend line op.  Returns true if this is the end
    of sequence.  */
 static int
-process_extended_line_op (data, is_stmt, pointer_size)
-     unsigned char *data;
-     int is_stmt;
-     int pointer_size;
+process_extended_line_op (unsigned char *data, int is_stmt, int pointer_size)
 {
   unsigned char op_code;
   int bytes_read;
@@ -6595,10 +6259,9 @@ process_extended_line_op (data, is_stmt, pointer_size)
 static int debug_line_pointer_size = 4;
 
 static int
-display_debug_lines (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char * start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_lines (Elf_Internal_Shdr *section,
+                    unsigned char * start,
+                    FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned char *hdrptr;
   DWARF2_Internal_LineInfo info;
@@ -6870,10 +6533,9 @@ display_debug_lines (section, start, file)
 }
 
 static int
-display_debug_pubnames (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_pubnames (Elf_Internal_Shdr *section,
+                       unsigned char *start,
+                       FILE *file ATTRIBUTE_UNUSED)
 {
   DWARF2_Internal_PubNames pubnames;
   unsigned char *end;
@@ -6957,8 +6619,7 @@ display_debug_pubnames (section, start, file)
 }
 
 static char *
-get_TAG_name (tag)
-     unsigned long tag;
+get_TAG_name (unsigned long tag)
 {
   switch (tag)
     {
@@ -7038,8 +6699,7 @@ get_TAG_name (tag)
 }
 
 static char *
-get_AT_name (attribute)
-     unsigned long attribute;
+get_AT_name (unsigned long attribute)
 {
   switch (attribute)
     {
@@ -7152,8 +6812,7 @@ get_AT_name (attribute)
 }
 
 static char *
-get_FORM_name (form)
-     unsigned long form;
+get_FORM_name (unsigned long form)
 {
   switch (form)
     {
@@ -7214,7 +6873,7 @@ static abbrev_entry *first_abbrev = NULL;
 static abbrev_entry *last_abbrev = NULL;
 
 static void
-free_abbrevs ()
+free_abbrevs (void)
 {
   abbrev_entry *abbrev;
 
@@ -7239,14 +6898,11 @@ free_abbrevs ()
 }
 
 static void
-add_abbrev (number, tag, children)
-     unsigned long number;
-     unsigned long tag;
-     int children;
+add_abbrev (unsigned long number, unsigned long tag, int children)
 {
   abbrev_entry *entry;
 
-  entry = (abbrev_entry *) malloc (sizeof (*entry));
+  entry = malloc (sizeof (*entry));
 
   if (entry == NULL)
     /* ugg */
@@ -7268,13 +6924,11 @@ add_abbrev (number, tag, children)
 }
 
 static void
-add_abbrev_attr (attribute, form)
-     unsigned long attribute;
-     unsigned long form;
+add_abbrev_attr (unsigned long attribute, unsigned long form)
 {
   abbrev_attr *attr;
 
-  attr = (abbrev_attr *) malloc (sizeof (*attr));
+  attr = malloc (sizeof (*attr));
 
   if (attr == NULL)
     /* ugg */
@@ -7298,9 +6952,7 @@ add_abbrev_attr (attribute, form)
    an abbreviation set was found.  */
 
 static unsigned char *
-process_abbrev_section (start, end)
-     unsigned char *start;
-     unsigned char *end;
+process_abbrev_section (unsigned char *start, unsigned char *end)
 {
   if (first_abbrev != NULL)
     return NULL;
@@ -7350,10 +7002,9 @@ process_abbrev_section (start, end)
 
 
 static int
-display_debug_macinfo (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_macinfo (Elf_Internal_Shdr *section,
+                      unsigned char *start,
+                      FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned char *end = start + section->sh_size;
   unsigned char *curr = start;
@@ -7424,10 +7075,9 @@ display_debug_macinfo (section, start, file)
 
 
 static int
-display_debug_abbrev (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_abbrev (Elf_Internal_Shdr *section,
+                     unsigned char *start,
+                     FILE *file ATTRIBUTE_UNUSED)
 {
   abbrev_entry *entry;
   unsigned char *end = start + section->sh_size;
@@ -7471,9 +7121,7 @@ display_debug_abbrev (section, start, file)
 
 
 static unsigned char *
-display_block (data, length)
-     unsigned char *data;
-     unsigned long length;
+display_block (unsigned char *data, unsigned long length)
 {
   printf (_(" %lu byte block: "), length);
 
@@ -7484,10 +7132,9 @@ display_block (data, length)
 }
 
 static void
-decode_location_expression (data, pointer_size, length)
-     unsigned char * data;
-     unsigned int pointer_size;
-     unsigned long length;
+decode_location_expression (unsigned char * data,
+                           unsigned int pointer_size,
+                           unsigned long length)
 {
   unsigned op;
   int bytes_read;
@@ -7820,8 +7467,7 @@ static const char *debug_loc_contents;
 static bfd_vma debug_loc_size;
 
 static void
-load_debug_loc (file)
-     FILE *file;
+load_debug_loc (FILE *file)
 {
   Elf_Internal_Shdr *sec;
   unsigned int i;
@@ -7842,13 +7488,12 @@ load_debug_loc (file)
 
   debug_loc_size = sec->sh_size;
 
-  debug_loc_contents = ((char *)
-                       get_data (NULL, file, sec->sh_offset, sec->sh_size,
-                                 _("debug_loc section data")));
+  debug_loc_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
+                                _("debug_loc section data"));
 }
 
 static void
-free_debug_loc ()
+free_debug_loc (void)
 {
   if (debug_loc_contents == NULL)
     return;
@@ -7860,10 +7505,9 @@ free_debug_loc ()
 
 
 static int
-display_debug_loc (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_loc (Elf_Internal_Shdr *section,
+                  unsigned char *start,
+                  FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned char *section_end;
   unsigned long bytes;
@@ -7933,8 +7577,7 @@ static const char *debug_str_contents;
 static bfd_vma debug_str_size;
 
 static void
-load_debug_str (file)
-     FILE *file;
+load_debug_str (FILE *file)
 {
   Elf_Internal_Shdr *sec;
   unsigned int i;
@@ -7955,13 +7598,12 @@ load_debug_str (file)
 
   debug_str_size = sec->sh_size;
 
-  debug_str_contents = ((char *)
-                       get_data (NULL, file, sec->sh_offset, sec->sh_size,
-                                 _("debug_str section data")));
+  debug_str_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
+                                _("debug_str section data"));
 }
 
 static void
-free_debug_str ()
+free_debug_str (void)
 {
   if (debug_str_contents == NULL)
     return;
@@ -7972,8 +7614,7 @@ free_debug_str ()
 }
 
 static const char *
-fetch_indirect_string (offset)
-     unsigned long offset;
+fetch_indirect_string (unsigned long offset)
 {
   if (debug_str_contents == NULL)
     return _("<no .debug_str section>");
@@ -7985,10 +7626,9 @@ fetch_indirect_string (offset)
 }
 
 static int
-display_debug_str (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_str (Elf_Internal_Shdr *section,
+                  unsigned char *start,
+                  FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned long bytes;
   bfd_vma addr;
@@ -8045,15 +7685,13 @@ display_debug_str (section, start, file)
 }
 
 static unsigned char *
-read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size,
-                             offset_size, dwarf_version)
-     unsigned long attribute;
-     unsigned long form;
-     unsigned char *data;
-     unsigned long cu_offset;
-     unsigned long pointer_size;
-     unsigned long offset_size;
-     int dwarf_version;
+read_and_display_attr_value (unsigned long attribute,
+                            unsigned long form,
+                            unsigned char *data,
+                            unsigned long cu_offset,
+                            unsigned long pointer_size,
+                            unsigned long offset_size,
+                            int dwarf_version)
 {
   unsigned long uvalue = 0;
   unsigned char *block_start = NULL;
@@ -8382,15 +8020,13 @@ read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size,
 }
 
 static unsigned char *
-read_and_display_attr (attribute, form, data, cu_offset, pointer_size,
-                       offset_size, dwarf_version)
-     unsigned long attribute;
-     unsigned long form;
-     unsigned char *data;
-     unsigned long cu_offset;
-     unsigned long pointer_size;
-     unsigned long offset_size;
-     int dwarf_version;
+read_and_display_attr (unsigned long attribute,
+                      unsigned long form,
+                      unsigned char *data,
+                      unsigned long cu_offset,
+                      unsigned long pointer_size,
+                      unsigned long offset_size,
+                      int dwarf_version)
 {
   printf ("     %-18s:", get_AT_name (attribute));
   data = read_and_display_attr_value (attribute, form, data, cu_offset,
@@ -8400,10 +8036,9 @@ read_and_display_attr (attribute, form, data, cu_offset, pointer_size,
 }
 
 static int
-display_debug_info (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file;
+display_debug_info (Elf_Internal_Shdr *section,
+                   unsigned char *start,
+                   FILE *file)
 {
   unsigned char *end = start + section->sh_size;
   unsigned char *section_begin = start;
@@ -8556,9 +8191,8 @@ display_debug_info (section, start, file)
            return 0;
          }
 
-       begin = ((unsigned char *)
-                get_data (NULL, file, sec->sh_offset, sec->sh_size,
-                          _("debug_abbrev section data")));
+       begin = get_data (NULL, file, sec->sh_offset, sec->sh_size,
+                         _("debug_abbrev section data"));
        if (!begin)
          return 0;
 
@@ -8628,10 +8262,9 @@ display_debug_info (section, start, file)
 }
 
 static int
-display_debug_aranges (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_aranges (Elf_Internal_Shdr *section,
+                      unsigned char *start,
+                      FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned char *end = start + section->sh_size;
 
@@ -8749,15 +8382,8 @@ Frame_Chunk;
    in the frame info.  */
 #define DW_CFA_unreferenced (-1)
 
-static void frame_need_space PARAMS ((Frame_Chunk *, int));
-static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
-static int size_of_encoded_value PARAMS ((int));
-static bfd_vma get_encoded_value PARAMS ((unsigned char *, int));
-
 static void
-frame_need_space (fc, reg)
-     Frame_Chunk *fc;
-     int reg;
+frame_need_space (Frame_Chunk *fc, int reg)
 {
   int prev = fc->ncols;
 
@@ -8765,10 +8391,8 @@ frame_need_space (fc, reg)
     return;
 
   fc->ncols = reg + 1;
-  fc->col_type = (short int *) xrealloc (fc->col_type,
-                                        fc->ncols * sizeof (short int));
-  fc->col_offset = (int *) xrealloc (fc->col_offset,
-                                    fc->ncols * sizeof (int));
+  fc->col_type = xrealloc (fc->col_type, fc->ncols * sizeof (short int));
+  fc->col_offset = xrealloc (fc->col_offset, fc->ncols * sizeof (int));
 
   while (prev < fc->ncols)
     {
@@ -8779,10 +8403,7 @@ frame_need_space (fc, reg)
 }
 
 static void
-frame_display_row (fc, need_col_headers, max_regs)
-     Frame_Chunk *fc;
-     int *need_col_headers;
-     int *max_regs;
+frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
 {
   int r;
   char tmp[100];
@@ -8847,8 +8468,7 @@ frame_display_row (fc, need_col_headers, max_regs)
 }
 
 static int
-size_of_encoded_value (encoding)
-     int encoding;
+size_of_encoded_value (int encoding)
 {
   switch (encoding & 0x7)
     {
@@ -8861,9 +8481,7 @@ size_of_encoded_value (encoding)
 }
 
 static bfd_vma
-get_encoded_value (data, encoding)
-     unsigned char *data;
-     int encoding;
+get_encoded_value (unsigned char *data, int encoding)
 {
   int size = size_of_encoded_value (encoding);
   if (encoding & DW_EH_PE_signed)
@@ -8877,10 +8495,9 @@ get_encoded_value (data, encoding)
 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
 
 static int
-display_debug_frames (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_frames (Elf_Internal_Shdr *section,
+                     unsigned char *start,
+                     FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned char *end = start + section->sh_size;
   unsigned char *section_start = start;
@@ -8939,15 +8556,15 @@ display_debug_frames (section, start, file)
        {
          int version;
 
-         fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
+         fc = xmalloc (sizeof (Frame_Chunk));
          memset (fc, 0, sizeof (Frame_Chunk));
 
          fc->next = chunks;
          chunks = fc;
          fc->chunk_start = saved_start;
          fc->ncols = 0;
-         fc->col_type = (short int *) xmalloc (sizeof (short int));
-         fc->col_offset = (int *) xmalloc (sizeof (int));
+         fc->col_type = xmalloc (sizeof (short int));
+         fc->col_offset = xmalloc (sizeof (int));
          frame_need_space (fc, max_regs-1);
 
          version = *start++;
@@ -9050,8 +8667,8 @@ display_debug_frames (section, start, file)
                    cie_id, saved_start);
              start = block_end;
              fc->ncols = 0;
-             fc->col_type = (short int *) xmalloc (sizeof (short int));
-             fc->col_offset = (int *) xmalloc (sizeof (int));
+             fc->col_type = xmalloc (sizeof (short int));
+             fc->col_offset = xmalloc (sizeof (int));
              frame_need_space (fc, max_regs - 1);
              cie = fc;
              fc->augmentation = "";
@@ -9060,8 +8677,8 @@ display_debug_frames (section, start, file)
          else
            {
              fc->ncols = cie->ncols;
-             fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
-             fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
+             fc->col_type = xmalloc (fc->ncols * sizeof (short int));
+             fc->col_offset = xmalloc (fc->ncols * sizeof (int));
              memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
              memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
              fc->augmentation = cie->augmentation;
@@ -9366,10 +8983,10 @@ display_debug_frames (section, start, file)
            case DW_CFA_remember_state:
              if (! do_debug_frames_interp)
                printf ("  DW_CFA_remember_state\n");
-             rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
+             rs = xmalloc (sizeof (Frame_Chunk));
              rs->ncols = fc->ncols;
-             rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
-             rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
+             rs->col_type = xmalloc (rs->ncols * sizeof (short int));
+             rs->col_offset = xmalloc (rs->ncols * sizeof (int));
              memcpy (rs->col_type, fc->col_type, rs->ncols);
              memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
              rs->next = remembered_state;
@@ -9522,10 +9139,9 @@ display_debug_frames (section, start, file)
 #undef SLEB
 
 static int
-display_debug_not_supported (section, start, file)
-     Elf_Internal_Shdr *section;
-     unsigned char *start ATTRIBUTE_UNUSED;
-     FILE *file ATTRIBUTE_UNUSED;
+display_debug_not_supported (Elf_Internal_Shdr *section,
+                            unsigned char *start ATTRIBUTE_UNUSED,
+                            FILE *file ATTRIBUTE_UNUSED)
 {
   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
            SECTION_NAME (section));
@@ -9537,10 +9153,9 @@ display_debug_not_supported (section, start, file)
    When dumping the .debug_line, we use that size information, assuming
    that all compilation units have the same address size.  */
 static int
-prescan_debug_info (section, start, file)
-     Elf_Internal_Shdr *section ATTRIBUTE_UNUSED;
-     unsigned char *start;
-     FILE *file ATTRIBUTE_UNUSED;
+prescan_debug_info (Elf_Internal_Shdr *section ATTRIBUTE_UNUSED,
+                   unsigned char *start,
+                   FILE *file ATTRIBUTE_UNUSED)
 {
   unsigned long length;
 
@@ -9587,8 +9202,8 @@ prescan_debug_info (section, start, file)
 struct
 {
   const char *const name;
-  int (*display) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
-  int (*prescan) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
+  int (*display) (Elf_Internal_Shdr *, unsigned char *, FILE *);
+  int (*prescan) (Elf_Internal_Shdr *, unsigned char *, FILE *);
 }
 debug_displays[] =
 {
@@ -9611,9 +9226,7 @@ debug_displays[] =
 };
 
 static int
-display_debug_section (section, file)
-     Elf_Internal_Shdr *section;
-     FILE *file;
+display_debug_section (Elf_Internal_Shdr *section, FILE *file)
 {
   char *name = SECTION_NAME (section);
   bfd_size_type length;
@@ -9627,8 +9240,8 @@ display_debug_section (section, file)
       return 0;
     }
 
-  start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
-                                     _("debug section data"));
+  start = get_data (NULL, file, section->sh_offset, length,
+                   _("debug section data"));
   if (!start)
     return 0;
 
@@ -9656,8 +9269,7 @@ display_debug_section (section, file)
 }
 
 static int
-process_section_contents (file)
-     FILE *file;
+process_section_contents (FILE *file)
 {
   Elf_Internal_Shdr *section;
   unsigned int i;
@@ -9688,9 +9300,8 @@ process_section_contents (file)
                unsigned char *start;
 
                length = section->sh_size;
-               start = ((unsigned char *)
-                        get_data (NULL, file, section->sh_offset, length,
-                                  _("debug section data")));
+               start = get_data (NULL, file, section->sh_offset, length,
+                                 _("debug section data"));
                if (!start)
                  return 0;
 
@@ -9724,8 +9335,7 @@ process_section_contents (file)
 }
 
 static void
-process_mips_fpe_exception (mask)
-     int mask;
+process_mips_fpe_exception (int mask)
 {
   if (mask)
     {
@@ -9746,8 +9356,7 @@ process_mips_fpe_exception (mask)
 }
 
 static int
-process_mips_specific (file)
-     FILE *file;
+process_mips_specific (FILE *file)
 {
   Elf_Internal_Dyn *entry;
   size_t liblist_offset = 0;
@@ -9792,10 +9401,9 @@ process_mips_specific (file)
       Elf32_External_Lib *elib;
       size_t cnt;
 
-      elib = ((Elf32_External_Lib *)
-             get_data (NULL, file, liblist_offset,
-                       liblistno * sizeof (Elf32_External_Lib),
-                       _("liblist")));
+      elib = get_data (NULL, file, liblist_offset,
+                      liblistno * sizeof (Elf32_External_Lib),
+                      _("liblist"));
       if (elib)
        {
          printf ("\nSection '.liblist' contains %lu entries:\n",
@@ -9879,12 +9487,11 @@ process_mips_specific (file)
       while (sect->sh_type != SHT_MIPS_OPTIONS)
        ++sect;
 
-      eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
-                                               sect->sh_size, _("options"));
+      eopt = get_data (NULL, file, options_offset, sect->sh_size,
+                      _("options"));
       if (eopt)
        {
-         iopt = ((Elf_Internal_Options *)
-                 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt)));
+         iopt = malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt));
          if (iopt == NULL)
            {
              error (_("Out of memory"));
@@ -10076,7 +9683,7 @@ process_mips_specific (file)
          return 0;
        }
 
-      iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
+      iconf = malloc (conflictsno * sizeof (*iconf));
       if (iconf == NULL)
        {
          error (_("Out of memory"));
@@ -10087,10 +9694,8 @@ process_mips_specific (file)
        {
          Elf32_External_Conflict *econf32;
 
-         econf32 = ((Elf32_External_Conflict *)
-                    get_data (NULL, file, conflicts_offset,
-                              conflictsno * sizeof (*econf32),
-                              _("conflict")));
+         econf32 = get_data (NULL, file, conflicts_offset,
+                             conflictsno * sizeof (*econf32), _("conflict"));
          if (!econf32)
            return 0;
 
@@ -10103,10 +9708,8 @@ process_mips_specific (file)
        {
          Elf64_External_Conflict *econf64;
 
-         econf64 = ((Elf64_External_Conflict *)
-                    get_data (NULL, file, conflicts_offset,
-                              conflictsno * sizeof (*econf64),
-                              _("conflict")));
+         econf64 = get_data (NULL, file, conflicts_offset,
+                             conflictsno * sizeof (*econf64), _("conflict"));
          if (!econf64)
            return 0;
 
@@ -10138,8 +9741,7 @@ process_mips_specific (file)
 }
 
 static int
-process_gnu_liblist (file)
-     FILE *file;
+process_gnu_liblist (FILE *file)
 {
   Elf_Internal_Shdr *section, *string_sec;
   Elf32_External_Lib *elib;
@@ -10157,17 +9759,15 @@ process_gnu_liblist (file)
       switch (section->sh_type)
        {
        case SHT_GNU_LIBLIST:
-         elib = ((Elf32_External_Lib *)
-                get_data (NULL, file, section->sh_offset, section->sh_size,
-                          _("liblist")));
+         elib = get_data (NULL, file, section->sh_offset, section->sh_size,
+                          _("liblist"));
 
          if (elib == NULL)
            break;
          string_sec = SECTION_HEADER (section->sh_link);
 
-         strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
-                                     string_sec->sh_size,
-                                     _("liblist string table"));
+         strtab = get_data (NULL, file, string_sec->sh_offset,
+                            string_sec->sh_size, _("liblist string table"));
 
          if (strtab == NULL
              || section->sh_entsize != sizeof (Elf32_External_Lib))
@@ -10218,8 +9818,7 @@ process_gnu_liblist (file)
 }
 
 static const char *
-get_note_type (e_type)
-     unsigned e_type;
+get_note_type (unsigned e_type)
 {
   static char buff[64];
 
@@ -10243,8 +9842,7 @@ get_note_type (e_type)
 }
 
 static const char *
-get_netbsd_elfcore_note_type (e_type)
-     unsigned e_type;
+get_netbsd_elfcore_note_type (unsigned e_type)
 {
   static char buff[64];
 
@@ -10310,8 +9908,7 @@ get_netbsd_elfcore_note_type (e_type)
 
    If the value of namesz is zero, there is no name present.  */
 static int
-process_note (pnote)
-     Elf_Internal_Note *pnote;
+process_note (Elf_Internal_Note *pnote)
 {
   const char *nt;
 
@@ -10341,10 +9938,7 @@ process_note (pnote)
 
 
 static int
-process_corefile_note_segment (file, offset, length)
-     FILE *file;
-     bfd_vma offset;
-     bfd_vma length;
+process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
 {
   Elf_External_Note *pnotes;
   Elf_External_Note *external;
@@ -10353,8 +9947,7 @@ process_corefile_note_segment (file, offset, length)
   if (length <= 0)
     return 0;
 
-  pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
-                                          _("notes"));
+  pnotes = get_data (NULL, file, offset, length, _("notes"));
   if (!pnotes)
     return 0;
 
@@ -10427,8 +10020,7 @@ process_corefile_note_segment (file, offset, length)
 }
 
 static int
-process_corefile_note_segments (file)
-     FILE *file;
+process_corefile_note_segments (FILE *file)
 {
   Elf_Internal_Phdr *segment;
   unsigned int i;
@@ -10451,8 +10043,7 @@ process_corefile_note_segments (file)
 }
 
 static int
-process_corefile_contents (file)
-     FILE *file;
+process_corefile_contents (FILE *file)
 {
   /* If we have not been asked to display the notes then do nothing.  */
   if (! do_notes)
@@ -10473,8 +10064,7 @@ process_corefile_contents (file)
 }
 
 static int
-process_arch_specific (file)
-     FILE *file;
+process_arch_specific (FILE *file)
 {
   if (! do_arch)
     return 1;
@@ -10492,8 +10082,7 @@ process_arch_specific (file)
 }
 
 static int
-get_file_header (file)
-     FILE *file;
+get_file_header (FILE *file)
 {
   /* Read in the identity array.  */
   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
@@ -10585,31 +10174,18 @@ get_file_header (file)
   return 1;
 }
 
+/* Process one ELF object file according to the command line options.
+   This file may actually be stored in an archive.  The file is
+   positioned at the start of the ELF object.  */
+
 static int
-process_file (file_name)
-     char *file_name;
+process_object (char *file_name, FILE *file)
 {
-  FILE *file;
-  struct stat statbuf;
   unsigned int i;
 
-  if (stat (file_name, & statbuf) < 0)
-    {
-      error (_("Cannot stat input file %s.\n"), file_name);
-      return 1;
-    }
-
-  file = fopen (file_name, "rb");
-  if (file == NULL)
-    {
-      error (_("Input file %s not found.\n"), file_name);
-      return 1;
-    }
-
   if (! get_file_header (file))
     {
       error (_("%s: Failed to read file header\n"), file_name);
-      fclose (file);
       return 1;
     }
 
@@ -10625,10 +10201,7 @@ process_file (file_name)
     printf (_("\nFile: %s\n"), file_name);
 
   if (! process_file_header ())
-    {
-      fclose (file);
-      return 1;
-    }
+    return 1;
 
   if (! process_section_headers (file))
     {
@@ -10661,8 +10234,6 @@ process_file (file_name)
 
   process_arch_specific (file);
 
-  fclose (file);
-
   if (program_headers)
     {
       free (program_headers);
@@ -10704,6 +10275,220 @@ process_file (file_name)
   return 0;
 }
 
+/* Process an ELF archive.  The file is positioned just after the
+   ARMAG string.  */
+
+static int
+process_archive (char *file_name, FILE *file)
+{
+  struct ar_hdr arhdr;
+  size_t got;
+  unsigned long size;
+  char *longnames = NULL;
+  unsigned long longnames_size = 0;
+  size_t file_name_size;
+  int ret;
+
+  show_name = 1;
+
+  got = fread (&arhdr, 1, sizeof arhdr, file);
+  if (got != sizeof arhdr)
+    {
+      if (got == 0)
+       return 0;
+
+      error (_("%s: failed to read archive header\n"), file_name);
+      return 1;
+    }
+
+  if (memcmp (arhdr.ar_name, "/               ", 16) == 0)
+    {
+      /* This is the archive symbol table.  Skip it.
+        FIXME: We should have an option to dump it.  */
+      size = strtoul (arhdr.ar_size, NULL, 10);
+      if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
+       {
+         error (_("%s: failed to skip archive symbol table\n"), file_name);
+         return 1;
+       }
+
+      got = fread (&arhdr, 1, sizeof arhdr, file);
+      if (got != sizeof arhdr)
+       {
+         if (got == 0)
+           return 0;
+
+         error (_("%s: failed to read archive header\n"), file_name);
+         return 1;
+       }
+    }
+
+  if (memcmp (arhdr.ar_name, "//              ", 16) == 0)
+    {
+      /* This is the archive string table holding long member
+        names.  */
+
+      longnames_size = strtoul (arhdr.ar_size, NULL, 10);
+
+      longnames = malloc (longnames_size);
+      if (longnames == NULL)
+       {
+         error (_("Out of memory\n"));
+         return 1;
+       }
+
+      if (fread (longnames, longnames_size, 1, file) != 1)
+       {
+         free (longnames);
+         error(_("%s: failed to read string table\n"), file_name);
+         return 1;
+       }
+
+      if ((longnames_size & 1) != 0)
+       getc (file);
+
+      got = fread (&arhdr, 1, sizeof arhdr, file);
+      if (got != sizeof arhdr)
+       {
+         free (longnames);
+
+         if (got == 0)
+           return 0;
+
+         error (_("%s: failed to read archive header\n"), file_name);
+         return 1;
+       }
+    }
+
+  file_name_size = strlen (file_name);
+  ret = 0;
+
+  while (1)
+    {
+      char *name;
+      char *nameend;
+      char *namealc;
+
+      if (arhdr.ar_name[0] == '/')
+       {
+         unsigned long off;
+
+         off = strtoul (arhdr.ar_name + 1, NULL, 10);
+         if (off >= longnames_size)
+           {
+             error (_("%s: invalid archive string table offset %lu\n"), off);
+             ret = 1;
+             break;
+           }
+
+         name = longnames + off;
+         nameend = memchr (name, '/', longnames_size - off);
+       }
+      else
+       {
+         name = arhdr.ar_name;
+         nameend = memchr (name, '/', 16);
+       }
+
+      if (nameend == NULL)
+       {
+         error (_("%s: bad archive file name\n"));
+         ret = 1;
+         break;
+       }
+
+      namealc = malloc (file_name_size + (nameend - name) + 3);
+      if (namealc == NULL)
+       {
+         error (_("Out of memory\n"));
+         ret = 1;
+         break;
+       }
+
+      memcpy (namealc, file_name, file_name_size);
+      namealc[file_name_size] = '(';
+      memcpy (namealc + file_name_size + 1, name, nameend - name);
+      namealc[file_name_size + 1 + (nameend - name)] = ')';
+      namealc[file_name_size + 2 + (nameend - name)] = '\0';
+
+      archive_file_offset = ftell (file);
+      archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
+
+      ret |= process_object (namealc, file);
+
+      free (namealc);
+
+      if (fseek (file,
+                (archive_file_offset
+                 + archive_file_size
+                 + (archive_file_size & 1)),
+                SEEK_SET) != 0)
+       {
+         error (_("%s: failed to seek to next archive header\n"), file_name);
+         ret = 1;
+         break;
+       }
+
+      got = fread (&arhdr, 1, sizeof arhdr, file);
+      if (got != sizeof arhdr)
+       {
+         if (got == 0)
+           break;
+
+         error (_("%s: failed to read archive header\n"), file_name);
+         ret = 1;
+         break;
+       }
+    }
+
+  if (longnames != 0)
+    free (longnames);
+
+  return ret;
+}
+
+static int
+process_file (char *file_name)
+{
+  FILE *file;
+  struct stat statbuf;
+  char armag[SARMAG];
+  int ret;
+
+  if (stat (file_name, &statbuf) < 0)
+    {
+      error (_("Cannot stat input file %s.\n"), file_name);
+      return 1;
+    }
+
+  file = fopen (file_name, "rb");
+  if (file == NULL)
+    {
+      error (_("Input file %s not found.\n"), file_name);
+      return 1;
+    }
+
+  if (fread (armag, SARMAG, 1, file) != 1)
+    {
+      error (_("%s: Failed to read file header\n"), file_name);
+      fclose (file);
+      return 1;
+    }
+
+  if (memcmp (armag, ARMAG, SARMAG) == 0)
+    ret = process_archive (file_name, file);
+  else
+    {
+      rewind (file);
+      archive_file_size = archive_file_offset = 0;
+      ret = process_object (file_name, file);
+    }
+
+  fclose (file);
+
+  return ret;
+}
+
 #ifdef SUPPORT_DISASSEMBLY
 /* Needed by the i386 disassembler.  For extra credit, someone could
    fix this so that we insert symbolic addresses here, esp for GOT/PLT
@@ -10723,12 +10508,8 @@ db_task_printsym (unsigned int addr)
 }
 #endif
 
-int main PARAMS ((int, char **));
-
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   int err;
   char *cmdline_dump_sects = NULL;