]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - binutils/readelf.c
Add entry for change in solib-osf.c (osf_in_dynsym_resolve_code).
[thirdparty/binutils-gdb.git] / binutils / readelf.c
index b7aecdebd9aa3163d47205760516d5b41732ec03..53ca41a9689acca7a619374498e460bea79d27f8 100644 (file)
 #include "bucomm.h"
 #include "getopt.h"
 
-char *                 program_name = "readelf";
-unsigned int           dynamic_addr;
-bfd_size_type                  dynamic_size;
-unsigned int           rela_addr;
-unsigned int           rela_size;
-char *                 dynamic_strings;
+char *                 program_name = "readelf";
+unsigned int           dynamic_addr;
+bfd_size_type          dynamic_size;
+unsigned int           rela_addr;
+unsigned int           rela_size;
+char *                 dynamic_strings;
 char *                 string_table;
 unsigned long          string_table_length;
 unsigned long           num_dynamic_syms;
-Elf_Internal_Sym *     dynamic_symbols;
+Elf_Internal_Sym *     dynamic_symbols;
 Elf_Internal_Syminfo * dynamic_syminfo;
-unsigned long          dynamic_syminfo_offset;
+unsigned long          dynamic_syminfo_offset;
 unsigned int           dynamic_syminfo_nent;
-char                   program_interpreter [64];
-int                    dynamic_info[DT_JMPREL + 1];
-int                    version_info[16];
-int                    loadaddr = 0;
+char                   program_interpreter [64];
+int                    dynamic_info[DT_JMPREL + 1];
+int                    version_info[16];
+int                    loadaddr = 0;
 Elf_Internal_Ehdr       elf_header;
 Elf_Internal_Shdr *     section_headers;
 Elf_Internal_Dyn *      dynamic_segment;
-int                    show_name;
-int                    do_dynamic;
-int                    do_syms;
-int                    do_reloc;
-int                    do_sections;
-int                    do_segments;
+int                    show_name;
+int                    do_dynamic;
+int                    do_syms;
+int                    do_reloc;
+int                    do_sections;
+int                    do_segments;
 int                    do_unwind;
-int                    do_using_dynamic;
-int                    do_header;
-int                    do_dump;
-int                    do_version;
+int                    do_using_dynamic;
+int                    do_header;
+int                    do_dump;
+int                    do_version;
 int                    do_histogram;
 int                    do_debugging;
 int                     do_debug_info;
@@ -118,6 +118,7 @@ int                     do_debug_lines;
 int                     do_debug_pubnames;
 int                     do_debug_aranges;
 int                     do_debug_frames;
+int                     do_debug_frames_interp;
 int                     do_arch;
 int                     do_notes;
 int                    is_32bit_elf;
@@ -152,8 +153,8 @@ static const char *       get_mips_dynamic_type       PARAMS ((unsigned long));
 static const char *       get_sparc64_dynamic_type    PARAMS ((unsigned long));
 static const char *       get_parisc_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_Rel **, 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_Rel **, 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));
@@ -171,7 +172,7 @@ 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 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));
@@ -199,10 +200,10 @@ static int *              get_dynamic_data            PARAMS ((FILE *, unsigned
 static int                get_32bit_dynamic_segment   PARAMS ((FILE *));
 static int                get_64bit_dynamic_segment   PARAMS ((FILE *));
 #ifdef SUPPORT_DISASSEMBLY
-static int               disassemble_section         PARAMS ((Elf32_Internal_Shdr *, FILE *));
+static int               disassemble_section         PARAMS ((Elf32_Internal_Shdr *, FILE *));
 #endif
-static int               dump_section                PARAMS ((Elf32_Internal_Shdr *, FILE *));
-static int               display_debug_section       PARAMS ((Elf32_Internal_Shdr *, FILE *));
+static int               dump_section                PARAMS ((Elf32_Internal_Shdr *, FILE *));
+static int               display_debug_section       PARAMS ((Elf32_Internal_Shdr *, FILE *));
 static int                display_debug_info          PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
 static int                display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
 static int                display_debug_lines         PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
@@ -227,11 +228,11 @@ static const char *       get_elf_class               PARAMS ((unsigned char));
 static const char *       get_data_encoding           PARAMS ((unsigned char));
 static const char *       get_osabi_name              PARAMS ((unsigned char));
 static int               guess_is_rela               PARAMS ((unsigned long));
-static char *            get_note_type                  PARAMS ((unsigned int));
+static char *            get_note_type                  PARAMS ((unsigned int));
 static int               process_note                   PARAMS ((Elf32_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_corefile_contents      PARAMS ((FILE *));
 
 typedef int Elf32_Word;
 
@@ -241,13 +242,13 @@ typedef int Elf32_Word;
 #endif
 #define UNKNOWN -1
 
-#define SECTION_NAME(X)        ((X) == NULL ? "<none>" : \
+#define SECTION_NAME(X)        ((X) == NULL ? "<none>" : \
                                 ((X)->sh_name >= string_table_length \
                                  ? "<corrupt>" : string_table + (X)->sh_name))
 
 #define DT_VERSIONTAGIDX(tag)  (DT_VERNEEDNUM - (tag)) /* Reverse order! */
 
-#define BYTE_GET(field)        byte_get (field, sizeof (field))
+#define BYTE_GET(field)        byte_get (field, sizeof (field))
 
 /* If we can support a 64 bit data type then BFD64 should be defined
    and sizeof (bfd_vma) == 8.  In this case when translating from an
@@ -258,12 +259,12 @@ typedef int Elf32_Word;
    equivalent of the 8 byte wide external counterparts, and so we must
    truncate the data.  */
 #ifdef  BFD64
-#define BYTE_GET8(field)       byte_get (field, -8)
+#define BYTE_GET8(field)       byte_get (field, -8)
 #else
-#define BYTE_GET8(field)       byte_get (field, 8)
+#define BYTE_GET8(field)       byte_get (field, 8)
 #endif
 
-#define NUM_ELEM(array)        (sizeof (array) / sizeof ((array)[0]))
+#define NUM_ELEM(array)        (sizeof (array) / sizeof ((array)[0]))
 
 #define GET_DATA_ALLOC(offset, size, var, type, reason)                        \
   if (fseek (file, offset, SEEK_SET))                                  \
@@ -278,20 +279,20 @@ typedef int Elf32_Word;
     {                                                                  \
       error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
       return 0;                                                                \
-    }                                                                  \
-                                                                       \
-  if (fread (var, size, 1, file) != 1)                                         \
-    {                                                                  \
-      error (_("Unable to read in %d bytes of %s\n"), size, reason);   \
-      free (var);                                                      \
+    }                                                                  \
+                                                                       \
+  if (fread (var, size, 1, file) != 1)                                 \
+    {                                                                  \
+      error (_("Unable to read in %d bytes of %s\n"), size, reason);   \
+      free (var);                                                      \
       var = NULL;                                                      \
-      return 0;                                                        \
+      return 0;                                                        \
     }
 
 
-#define GET_DATA(offset, var, reason)                                  \
+#define GET_DATA(offset, var, reason)                                  \
   if (fseek (file, offset, SEEK_SET))                                  \
-    {                                                                  \
+    {                                                                  \
       error (_("Unable to seek to %x for %s\n"), offset, reason);      \
       return 0;                                                                \
     }                                                                  \
@@ -376,11 +377,13 @@ byte_get_little_endian (field, size)
       return  ((unsigned int) (field [0]))
        |    (((unsigned int) (field [1])) << 8);
 
+#ifndef BFD64
     case 8:
       /* We want to extract data from an 8 byte wide field and
         place it into a 4 byte wide field.  Since this is a little
         endian source we can juts use the 4 byte extraction code.  */
       /* Fall through.  */
+#endif
     case 4:
       return  ((unsigned long) (field [0]))
        |    (((unsigned long) (field [1])) << 8)
@@ -388,6 +391,7 @@ byte_get_little_endian (field, size)
        |    (((unsigned long) (field [3])) << 24);
 
 #ifdef BFD64
+    case 8:
     case -8:
       /* This is a special case, generated by the BYTE_GET8 macro.
         It means that we are loading an 8 byte value from a field
@@ -516,6 +520,7 @@ byte_get_big_endian (field, size)
        |   (((unsigned long) (field [1])) << 16)
        |   (((unsigned long) (field [0])) << 24);
 
+#ifndef BFD64
     case 8:
       /* Although we are extracing data from an 8 byte wide field, we
         are returning only 4 bytes of data.  */
@@ -523,8 +528,8 @@ byte_get_big_endian (field, size)
        |   (((unsigned long) (field [6])) << 8)
        |   (((unsigned long) (field [5])) << 16)
        |   (((unsigned long) (field [4])) << 24);
-
-#ifdef BFD64
+#else
+    case 8:
     case -8:
       /* This is a special case, generated by the BYTE_GET8 macro.
         It means that we are loading an 8 byte value from a field
@@ -562,7 +567,7 @@ guess_is_rela (e_machine)
     case EM_CYGNUS_M32R:
     case EM_CYGNUS_D10V:
     case EM_MIPS:
-    case EM_MIPS_RS4_BE:
+    case EM_MIPS_RS3_LE:
       return FALSE;
 
       /* Targets that use RELA relocations.  */
@@ -902,7 +907,7 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
          break;
 
        case EM_MIPS:
-       case EM_MIPS_RS4_BE:
+       case EM_MIPS_RS3_LE:
          rtype = elf_mips_reloc_type (type);
          break;
 
@@ -959,31 +964,28 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
 
       if (symtab_index)
        {
-         if (symtab != NULL)
+         if (symtab == NULL || symtab_index >= nsyms)
+           printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
+         else
            {
-             if (symtab_index >= nsyms)
-               printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
-             else
-               {
-                 Elf_Internal_Sym * psym;
+             Elf_Internal_Sym * psym;
 
-                 psym = symtab + symtab_index;
+             psym = symtab + symtab_index;
 
-                 printf (" ");
-                 print_vma (psym->st_value, LONG_HEX);
-                 printf ("  ");
+             printf (" ");
+             print_vma (psym->st_value, LONG_HEX);
+             printf ("  ");
 
-                 if (psym->st_name == 0)
-                   printf ("%-25.25s",
-                           SECTION_NAME (section_headers + psym->st_shndx));
-                 else if (strtab == NULL)
-                   printf (_("<string table index %3ld>"), psym->st_name);
-                 else
-                   printf ("%-25.25s", strtab + psym->st_name);
+             if (psym->st_name == 0)
+               printf ("%-25.25s",
+                       SECTION_NAME (section_headers + psym->st_shndx));
+             else if (strtab == NULL)
+               printf (_("<string table index %3ld>"), psym->st_name);
+             else
+               printf ("%-25.25s", strtab + psym->st_name);
 
-                 if (is_rela)
-                   printf (" + %lx", (unsigned long) relas [i].r_addend);
-               }
+             if (is_rela)
+               printf (" + %lx", (unsigned long) relas [i].r_addend);
            }
        }
       else if (is_rela)
@@ -1179,7 +1181,7 @@ get_dynamic_type (type)
          switch (elf_header.e_machine)
            {
            case EM_MIPS:
-           case EM_MIPS_RS4_BE:
+           case EM_MIPS_RS3_LE:
              result = get_mips_dynamic_type (type);
              break;
            case EM_SPARCV9:
@@ -1254,32 +1256,32 @@ get_machine_name (e_machine)
 
   switch (e_machine)
     {
-    case EM_NONE:              return _("None");
-    case EM_M32:               return "WE32100";
-    case EM_SPARC:             return "Sparc";
-    case EM_386:               return "Intel 80386";
-    case EM_68K:               return "MC68000";
-    case EM_88K:               return "MC88000";
-    case EM_486:               return "Intel 80486";
-    case EM_860:               return "Intel 80860";
-    case EM_MIPS:              return "MIPS R3000";
-    case EM_S370:              return "IBM System/370";
-    case EM_MIPS_RS4_BE:       return "MIPS R4000 big-endian";
+    case EM_NONE:              return _("None");
+    case EM_M32:               return "WE32100";
+    case EM_SPARC:             return "Sparc";
+    case EM_386:               return "Intel 80386";
+    case EM_68K:               return "MC68000";
+    case EM_88K:               return "MC88000";
+    case EM_486:               return "Intel 80486";
+    case EM_860:               return "Intel 80860";
+    case EM_MIPS:              return "MIPS R3000";
+    case EM_S370:              return "IBM System/370";
+    case EM_MIPS_RS3_LE:       return "MIPS R4000 big-endian";
     case EM_OLD_SPARCV9:       return "Sparc v9 (old)";
-    case EM_PARISC:            return "HPPA";
+    case EM_PARISC:            return "HPPA";
     case EM_PPC_OLD:           return "Power PC (old)";
-    case EM_SPARC32PLUS:       return "Sparc v8+" ;
-    case EM_960:               return "Intel 90860";
-    case EM_PPC:               return "PowerPC";
-    case EM_V800:              return "NEC V800";
-    case EM_FR20:              return "Fujitsu FR20";
-    case EM_RH32:              return "TRW RH32";
+    case EM_SPARC32PLUS:       return "Sparc v8+" ;
+    case EM_960:               return "Intel 90860";
+    case EM_PPC:               return "PowerPC";
+    case EM_V800:              return "NEC V800";
+    case EM_FR20:              return "Fujitsu FR20";
+    case EM_RH32:              return "TRW RH32";
     case EM_MCORE:             return "MCORE";
-    case EM_ARM:               return "ARM";
-    case EM_OLD_ALPHA:         return "Digital Alpha (old)";
-    case EM_SH:                        return "Hitachi SH";
-    case EM_SPARCV9:           return "Sparc v9";
-    case EM_TRICORE:           return "Siemens Tricore";
+    case EM_ARM:               return "ARM";
+    case EM_OLD_ALPHA:         return "Digital Alpha (old)";
+    case EM_SH:                        return "Hitachi SH";
+    case EM_SPARCV9:           return "Sparc v9";
+    case EM_TRICORE:           return "Siemens Tricore";
     case EM_ARC:               return "ARC";
     case EM_H8_300:            return "Hitachi H8/300";
     case EM_H8_300H:           return "Hitachi H8/300H";
@@ -1289,7 +1291,7 @@ get_machine_name (e_machine)
     case EM_MIPS_X:            return "Stanford MIPS-X";
     case EM_COLDFIRE:          return "Motorola Coldfire";
     case EM_68HC12:            return "Motorola M68HC12";
-    case EM_ALPHA:             return "Alpha";
+    case EM_ALPHA:             return "Alpha";
     case EM_CYGNUS_D10V:        return "d10v";
     case EM_CYGNUS_D30V:        return "d30v";
     case EM_CYGNUS_ARC:                return "ARC";
@@ -1299,32 +1301,32 @@ get_machine_name (e_machine)
     case EM_CYGNUS_MN10200:    return "mn10200";
     case EM_CYGNUS_FR30:       return "Fujitsu FR30";
     case EM_PJ:                 return "picoJava";
-    case EM_MMA:               return "Fujitsu Multimedia Accelerator";
-    case EM_PCP:               return "Siemens PCP";
-    case EM_NCPU:              return "Sony nCPU embedded RISC processor";
-    case EM_NDR1:              return "Denso NDR1 microprocesspr";
-    case EM_STARCORE:          return "Motorola Star*Core processor";
-    case EM_ME16:              return "Toyota ME16 processor";
-    case EM_ST100:             return "STMicroelectronics ST100 processor";
-    case EM_TINYJ:             return "Advanced Logic Corp. TinyJ embedded processor";
-    case EM_FX66:              return "Siemens FX66 microcontroller";
-    case EM_ST9PLUS:           return "STMicroelectronics ST9+ 8/16 bit microcontroller";
-    case EM_ST7:               return "STMicroelectronics ST7 8-bit microcontroller";
-    case EM_68HC16:            return "Motorola MC68HC16 Microcontroller";
-    case EM_68HC11:            return "Motorola MC68HC11 Microcontroller";
-    case EM_68HC08:            return "Motorola MC68HC08 Microcontroller";
-    case EM_68HC05:            return "Motorola MC68HC05 Microcontroller";
-    case EM_SVX:               return "Silicon Graphics SVx";
-    case EM_ST19:              return "STMicroelectronics ST19 8-bit microcontroller";
-    case EM_VAX:               return "Digital VAX";
+    case EM_MMA:               return "Fujitsu Multimedia Accelerator";
+    case EM_PCP:               return "Siemens PCP";
+    case EM_NCPU:              return "Sony nCPU embedded RISC processor";
+    case EM_NDR1:              return "Denso NDR1 microprocesspr";
+    case EM_STARCORE:          return "Motorola Star*Core processor";
+    case EM_ME16:              return "Toyota ME16 processor";
+    case EM_ST100:             return "STMicroelectronics ST100 processor";
+    case EM_TINYJ:             return "Advanced Logic Corp. TinyJ embedded processor";
+    case EM_FX66:              return "Siemens FX66 microcontroller";
+    case EM_ST9PLUS:           return "STMicroelectronics ST9+ 8/16 bit microcontroller";
+    case EM_ST7:               return "STMicroelectronics ST7 8-bit microcontroller";
+    case EM_68HC16:            return "Motorola MC68HC16 Microcontroller";
+    case EM_68HC11:            return "Motorola MC68HC11 Microcontroller";
+    case EM_68HC08:            return "Motorola MC68HC08 Microcontroller";
+    case EM_68HC05:            return "Motorola MC68HC05 Microcontroller";
+    case EM_SVX:               return "Silicon Graphics SVx";
+    case EM_ST19:              return "STMicroelectronics ST19 8-bit microcontroller";
+    case EM_VAX:               return "Digital VAX";
     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
     case EM_CRIS:              return "Axis Communications 32-bit embedded processor";
-    case EM_JAVELIN:           return "Infineon Technologies 32-bit embedded cpu";
-    case EM_FIREPATH:          return "Element 14 64-bit DSP processor";
-    case EM_ZSP:               return "LSI Logic's 16-bit DSP processor";
+    case EM_JAVELIN:           return "Infineon Technologies 32-bit embedded cpu";
+    case EM_FIREPATH:          return "Element 14 64-bit DSP processor";
+    case EM_ZSP:               return "LSI Logic's 16-bit DSP processor";
     case EM_MMIX:              return "Donald Knuth's educational 64-bit processor";
-    case EM_HUANY:             return "Harvard Universitys's machine-independent object format";
-    case EM_PRISM:             return "SiTera Prism";
+    case EM_HUANY:             return "Harvard Universitys's machine-independent object format";
+    case EM_PRISM:             return "SiTera Prism";
     case EM_X86_64:            return "Advanced Micro Devices X86-64";
     case EM_S390_OLD:
     case EM_S390:               return "IBM S/390";
@@ -1537,7 +1539,7 @@ get_machine_flags (e_flags, e_machine)
          break;
 
        case EM_MIPS:
-       case EM_MIPS_RS4_BE:
+       case EM_MIPS_RS3_LE:
          if (e_flags & EF_MIPS_NOREORDER)
            strcat (buf, ", noreorder");
 
@@ -1752,7 +1754,7 @@ get_segment_type (p_type)
          switch (elf_header.e_machine)
            {
            case EM_MIPS:
-           case EM_MIPS_RS4_BE:
+           case EM_MIPS_RS3_LE:
              result = get_mips_segment_type (p_type);
              break;
            case EM_PARISC:
@@ -1918,7 +1920,7 @@ get_section_type_name (sh_type)
          switch (elf_header.e_machine)
            {
            case EM_MIPS:
-           case EM_MIPS_RS4_BE:
+           case EM_MIPS_RS3_LE:
              result = get_mips_section_type_name (sh_type);
              break;
            case EM_PARISC:
@@ -2164,8 +2166,9 @@ parse_args (argc, argv)
                  do_debug_aranges = 1;
                  break;
 
-               case 'f':
                case 'F':
+                 do_debug_frames_interp = 1;
+               case 'f':
                  do_debug_frames = 1;
                  break;
 
@@ -2895,7 +2898,8 @@ process_section_headers (file)
                          dynamic_strings, char *, "dynamic strings");
        }
       else if ((do_debugging || do_debug_info || do_debug_abbrevs
-               || do_debug_lines || do_debug_pubnames || do_debug_aranges || do_debug_frames)
+               || do_debug_lines || do_debug_pubnames || do_debug_aranges
+               || do_debug_frames)
               && strncmp (name, ".debug_", 7) == 0)
        {
          name += 7;
@@ -3049,8 +3053,8 @@ process_relocs (file)
   else
     {
       Elf32_Internal_Shdr *     section;
-      unsigned long            i;
-      int                      found = 0;
+      unsigned long            i;
+      int              found = 0;
 
       for (i = 0, section = section_headers;
           i < elf_header.e_shnum;
@@ -3066,7 +3070,6 @@ process_relocs (file)
          if (rel_size)
            {
              Elf32_Internal_Shdr * strsec;
-             Elf32_Internal_Shdr * symsec;
              Elf_Internal_Sym *    symtab;
              char *                strtab;
              int                   is_rela;
@@ -3082,25 +3085,34 @@ process_relocs (file)
              printf (_(" at offset 0x%lx contains %lu entries:\n"),
                 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
 
-             symsec = section_headers + section->sh_link;
-
-             nsyms = symsec->sh_size / symsec->sh_entsize;
-             symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
+             symtab = NULL;
+             strtab = NULL;
+             nsyms = 0;
+             if (section->sh_link)
+               {
+                 Elf32_Internal_Shdr * symsec;
 
-             if (symtab == NULL)
-               continue;
+                 symsec = section_headers + section->sh_link;
+                 nsyms = symsec->sh_size / symsec->sh_entsize;
+                 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
 
-             strsec = section_headers + symsec->sh_link;
+                 if (symtab == NULL)
+                   continue;
 
-             GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
-                             char *, "string table");
+                 strsec = section_headers + symsec->sh_link;
 
+                 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
+                                 char *, "string table");
+               }
              is_rela = section->sh_type == SHT_RELA;
 
-             dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
+             dump_relocations (file, rel_offset, rel_size,
+                               symtab, nsyms, strtab, is_rela);
 
-             free (strtab);
-             free (symtab);
+             if (strtab)
+               free (strtab);
+             if (symtab)
+               free (symtab);
 
              found = 1;
            }
@@ -3195,7 +3207,7 @@ dump_ia64_unwind (aux)
   bfd_vma addr_size;
   struct unw_table_entry * tp;
   int in_body;
-  
+
   addr_size = is_32bit_elf ? 4 : 8;
 
   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
@@ -4273,7 +4285,7 @@ process_dynamic_segment (file)
              switch (elf_header.e_machine)
                {
                case EM_MIPS:
-               case EM_MIPS_RS4_BE:
+               case EM_MIPS_RS3_LE:
                  dynamic_segment_mips_val (entry);
                  break;
                case EM_PARISC:
@@ -4513,12 +4525,12 @@ process_version_sections (file)
        case SHT_GNU_versym:
          {
            Elf32_Internal_Shdr *       link_section;
-           int                         total;
-           int                         cnt;
-           unsigned char *             edata;
-           unsigned short *            data;
-           char *                      strtab;
-           Elf_Internal_Sym *          symbols;
+           int         total;
+           int         cnt;
+           unsigned char *             edata;
+           unsigned short *            data;
+           char *              strtab;
+           Elf_Internal_Sym *          symbols;
            Elf32_Internal_Shdr *       string_sec;
 
            link_section = section_headers + section->sh_link;
@@ -6991,12 +7003,13 @@ typedef struct Frame_Chunk
   int *                col_offset;
   char *               augmentation;
   unsigned int         code_factor;
-  unsigned int         data_factor;
+  int                  data_factor;
   unsigned long        pc_begin;
   unsigned long        pc_range;
   int                  cfa_reg;
   int                  cfa_offset;
   int                  ra;
+  unsigned char        fde_encoding;
 }
 Frame_Chunk;
 
@@ -7058,7 +7071,7 @@ frame_display_row (fc, need_col_headers, max_regs)
       printf ("\n");
     }
 
-  printf ("%08x ", (unsigned int) fc->pc_begin);
+  printf ("%08lx ", fc->pc_begin);
   sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
   printf ("%-8s ", tmp);
 
@@ -7090,6 +7103,20 @@ frame_display_row (fc, need_col_headers, max_regs)
   printf ("\n");
 }
 
+static int
+size_of_encoded_value (encoding)
+     int encoding;
+{
+  switch (encoding & 0x7)
+    {
+    default:   /* ??? */
+    case 0:    return is_32bit_elf ? 4 : 8;
+    case 2:    return 2;
+    case 3:    return 4;
+    case 4:    return 8;
+    }
+}
+
 #define GET(N) byte_get (start, N); start += N
 #define LEB()  read_leb128 (start, & length_return, 0); start += length_return
 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
@@ -7108,6 +7135,7 @@ display_debug_frames (section, start, file)
   int             is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
   int             length_return;
   int             max_regs = 0;
+  int             addr_size = is_32bit_elf ? 4 : 8;
 
   printf (_("The section %s contains:\n"), SECTION_NAME (section));
 
@@ -7120,6 +7148,9 @@ display_debug_frames (section, start, file)
       Frame_Chunk *   fc;
       Frame_Chunk *   cie;
       int             need_col_headers = 1;
+      unsigned char * augmentation_data = NULL;
+      unsigned long   augmentation_data_len = 0;
+      int            encoded_ptr_size = addr_size;
 
       saved_start = start;
       length = byte_get (start, 4); start += 4;
@@ -7130,10 +7161,10 @@ display_debug_frames (section, start, file)
       block_end = saved_start + length + 4;
       cie_id = byte_get (start, 4); start += 4;
 
-      printf ("\n%08x %08lx %08lx ", saved_start - section_start, length, cie_id);
-
       if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
        {
+         int version;
+
          fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
          memset (fc, 0, sizeof (Frame_Chunk));
 
@@ -7145,27 +7176,23 @@ display_debug_frames (section, start, file)
          fc->col_offset = (int *) xmalloc (sizeof (int));
          frame_need_space (fc, max_regs-1);
 
-         start ++; /* version */
-         fc->augmentation = start;
-
-         while (* start)
-           start++;
+         version = *start++;
 
-         start++; /* skip past NUL */
+         fc->augmentation = start;
+         start = strchr (start, '\0') + 1;
 
          if (fc->augmentation[0] == 'z')
            {
-             int xtra;
              fc->code_factor = LEB ();
              fc->data_factor = SLEB ();
              fc->ra = byte_get (start, 1); start += 1;
-             xtra = LEB ();
-             printf ("skipping %d extra bytes\n", xtra);
-             start += xtra;
+             augmentation_data_len = LEB ();
+             augmentation_data = start;
+             start += augmentation_data_len;
            }
          else if (strcmp (fc->augmentation, "eh") == 0)
            {
-             start += 4;
+             start += addr_size;
              fc->code_factor = LEB ();
              fc->data_factor = SLEB ();
              fc->ra = byte_get (start, 1); start += 1;
@@ -7177,8 +7204,55 @@ display_debug_frames (section, start, file)
              fc->ra = byte_get (start, 1); start += 1;
            }
          cie = fc;
-         printf ("CIE \"%s\" cf=%d df=%d ra=%d\n",
-                 fc->augmentation, fc->code_factor, fc->data_factor, fc->ra);
+
+         if (do_debug_frames_interp)
+           printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
+                   (unsigned long)(saved_start - section_start), length, cie_id,
+                   fc->augmentation, fc->code_factor, fc->data_factor,
+                   fc->ra);
+         else
+           {
+             printf ("\n%08lx %08lx %08lx CIE\n",
+                     (unsigned long)(saved_start - section_start), length, cie_id);
+             printf ("  Version:               %d\n", version);
+             printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
+             printf ("  Code alignment factor: %u\n", fc->code_factor);
+             printf ("  Data alignment factor: %d\n", fc->data_factor);
+             printf ("  Return address column: %d\n", fc->ra);
+
+             if (augmentation_data_len)
+               {
+                 unsigned long i;
+                 printf ("  Augmentation data:    ");
+                 for (i = 0; i < augmentation_data_len; ++i)
+                   printf (" %02x", augmentation_data[i]);
+                 putchar ('\n');
+               }
+             putchar ('\n');
+           }
+
+         if (augmentation_data_len)
+           {
+             unsigned char *p, *q;
+             p = fc->augmentation + 1;
+             q = augmentation_data;
+
+             while (1)
+               {
+                 if (*p == 'L')
+                   q++;
+                 else if (*p == 'P')
+                   q += 1 + size_of_encoded_value (*q);
+                 else if (*p == 'R')
+                   fc->fde_encoding = *q++;
+                 else
+                   break;
+                 p++;
+               }
+
+             if (fc->fde_encoding)
+               encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
+           }
 
          frame_need_space (fc, fc->ra);
        }
@@ -7190,15 +7264,16 @@ display_debug_frames (section, start, file)
          fc = & fde_fc;
          memset (fc, 0, sizeof (Frame_Chunk));
 
-         look_for = is_eh ? start-4-cie_id : (unsigned char *) cie_id;
+         look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
 
-         fc->pc_begin = byte_get (start, 4); start += 4;
-         fc->pc_range = byte_get (start, 4); start += 4;
+         for (cie=chunks; cie ; cie = cie->next)
+           if (cie->chunk_start == look_for)
+             break;
 
-         for (cie=chunks; cie && (cie->chunk_start != look_for); cie = cie->next);
          if (!cie)
            {
-             warn ("Invalid CIE pointer %08x in FDE at %08x\n", cie_id, saved_start);
+             warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
+                   cie_id, saved_start);
              start = block_end;
              fc->ncols = 0;
              fc->col_type = (short int *) xmalloc (sizeof (short int));
@@ -7206,6 +7281,7 @@ display_debug_frames (section, start, file)
              frame_need_space (fc, max_regs - 1);
              cie = fc;
              fc->augmentation = "";
+             fc->fde_encoding = 0;
            }
          else
            {
@@ -7221,25 +7297,43 @@ display_debug_frames (section, start, file)
              fc->cfa_offset = cie->cfa_offset;
              fc->ra = cie->ra;
              frame_need_space (fc, max_regs-1);
+             fc->fde_encoding = cie->fde_encoding;
            }
 
+         if (fc->fde_encoding)
+           encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
+
+         fc->pc_begin = byte_get (start, encoded_ptr_size);
+         start += encoded_ptr_size;
+         fc->pc_range = byte_get (start, encoded_ptr_size);
+         start += encoded_ptr_size;
+
          if (cie->augmentation[0] == 'z')
            {
-             unsigned long l = LEB ();
-             start += l;
+             augmentation_data_len = LEB ();
+             augmentation_data = start;
+             start += augmentation_data_len;
            }
 
-         printf ("FDE cie=%08x pc=%08lx..%08lx\n",
-                 cie->chunk_start-section_start, fc->pc_begin,
+         printf ("\n%08lx %08lx %08lx FDE cie=%08x pc=%08lx..%08lx\n",
+                 (unsigned long)(saved_start - section_start), length, cie_id,
+                 cie->chunk_start - section_start, fc->pc_begin,
                  fc->pc_begin + fc->pc_range);
+         if (! do_debug_frames_interp && augmentation_data_len)
+           {
+             unsigned long i;
+             printf ("  Augmentation data:    ");
+             for (i = 0; i < augmentation_data_len; ++i)
+               printf (" %02x", augmentation_data[i]);
+             putchar ('\n');
+             putchar ('\n');
+           }
        }
 
       /* At this point, fc is the current chunk, cie (if any) is set, and we're
         about to interpret instructions for the chunk.  */
 
-      /* This exists for readelf maintainers.  */
-#define FDEBUG 0
-
+      if (do_debug_frames_interp)
       {
        /* Start by making a pass over the chunk, allocating storage
            and taking note of what registers are used.  */
@@ -7249,13 +7343,12 @@ display_debug_frames (section, start, file)
          {
            unsigned op, opa;
            unsigned long reg;
-           bfd_vma vma;
-           
+
            op = * start ++;
            opa = op & 0x3f;
            if (op & 0xc0)
              op &= 0xc0;
-           
+
            /* Warning: if you add any more cases to this switch, be
               sure to add them to the corresponding switch below.  */
            switch (op)
@@ -7272,7 +7365,7 @@ display_debug_frames (section, start, file)
                fc->col_type[opa] = DW_CFA_undefined;
                break;
              case DW_CFA_set_loc:
-               start += sizeof (vma);
+               start += encoded_ptr_size;
                break;
              case DW_CFA_advance_loc1:
                start += 1;
@@ -7322,15 +7415,15 @@ display_debug_frames (section, start, file)
 #endif
              case DW_CFA_GNU_args_size:
                LEB ();
-               break;          
+               break;
 #ifndef DW_CFA_GNU_negative_offset_extended
 #define DW_CFA_GNU_negative_offset_extended 0x2f
 #endif
              case DW_CFA_GNU_negative_offset_extended:
-               reg = LEB (); LEB ();      
+               reg = LEB (); LEB ();
                frame_need_space (fc, reg);
                fc->col_type[reg] = DW_CFA_undefined;
-               
+
              default:
                break;
              }
@@ -7358,103 +7451,104 @@ display_debug_frames (section, start, file)
          switch (op)
            {
            case DW_CFA_advance_loc:
-             frame_display_row (fc, &need_col_headers, &max_regs);
-#if FDEBUG
-             printf ("  DW_CFA_advance_loc: %08x = %08x + %d*%d\n",
-                     fc->pc_begin + opa * fc->code_factor, fc->pc_begin, opa, fc->code_factor);
-#endif
+             if (do_debug_frames_interp)
+               frame_display_row (fc, &need_col_headers, &max_regs);
+             else
+               printf ("  DW_CFA_advance_loc: %d to %08lx\n",
+                       opa * fc->code_factor,
+                       fc->pc_begin + opa * fc->code_factor);
              fc->pc_begin += opa * fc->code_factor;
              break;
 
            case DW_CFA_offset:
              roffs = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_offset: r%d = cfa[%d*%d]\n", opa, roffs, fc->data_factor);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_offset: r%d at cfa%+ld\n",
+                       opa, roffs * fc->data_factor);
              fc->col_type[opa] = DW_CFA_offset;
              fc->col_offset[opa] = roffs * fc->data_factor;
              break;
 
            case DW_CFA_restore:
-#if FDEBUG
-             printf ("  DW_CFA_restore: r%d\n", opa);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_restore: r%d\n", opa);
              fc->col_type[opa] = cie->col_type[opa];
              fc->col_offset[opa] = cie->col_offset[opa];
              break;
 
            case DW_CFA_set_loc:
-             frame_display_row (fc, &need_col_headers, &max_regs);
-             vma = byte_get (start, sizeof (vma)); start += sizeof (vma);
-#if FDEBUG
-             printf ("  DW_CFA_set_loc: %08x\n", vma);
-#endif
+             vma = byte_get (start, encoded_ptr_size);
+             start += encoded_ptr_size;
+             if (do_debug_frames_interp)
+               frame_display_row (fc, &need_col_headers, &max_regs);
+             else
+               printf ("  DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
              fc->pc_begin = vma;
              break;
 
            case DW_CFA_advance_loc1:
-             frame_display_row (fc, &need_col_headers, &max_regs);
              ofs = byte_get (start, 1); start += 1;
-#if FDEBUG
-             printf ("  DW_CFA_advance_loc1: %08x = %08x + %d*%d\n",
-                     fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
-#endif
+             if (do_debug_frames_interp)
+               frame_display_row (fc, &need_col_headers, &max_regs);
+             else
+               printf ("  DW_CFA_advance_loc1: %ld to %08lx\n",
+                       ofs * fc->code_factor,
+                       fc->pc_begin + ofs * fc->code_factor);
              fc->pc_begin += ofs * fc->code_factor;
              break;
 
            case DW_CFA_advance_loc2:
-             frame_display_row (fc, &need_col_headers, &max_regs);
              ofs = byte_get (start, 2); start += 2;
-#if FDEBUG
-             printf ("  DW_CFA_advance_loc2: %08x = %08x + %d*%d\n",
-                     fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
-#endif
+             if (do_debug_frames_interp)
+               frame_display_row (fc, &need_col_headers, &max_regs);
+             else
+               printf ("  DW_CFA_advance_loc2: %ld to %08lx\n",
+                       ofs * fc->code_factor,
+                       fc->pc_begin + ofs * fc->code_factor);
              fc->pc_begin += ofs * fc->code_factor;
              break;
 
            case DW_CFA_advance_loc4:
-             frame_display_row (fc, &need_col_headers, &max_regs);
              ofs = byte_get (start, 4); start += 4;
-#if FDEBUG
-             printf ("  DW_CFA_advance_loc4: %08x = %08x + %d*%d\n",
-                     fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
-#endif
+             if (do_debug_frames_interp)
+               frame_display_row (fc, &need_col_headers, &max_regs);
+             else
+               printf ("  DW_CFA_advance_loc4: %ld to %08lx\n",
+                       ofs * fc->code_factor,
+                       fc->pc_begin + ofs * fc->code_factor);
              fc->pc_begin += ofs * fc->code_factor;
              break;
 
            case DW_CFA_offset_extended:
              reg = LEB ();
              roffs = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_offset_extended: r%d = cfa[%d*%d]\n", reg, roffs, fc->data_factor);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_offset_extended: r%ld at cfa%+ld\n",
+                       reg, roffs * fc->data_factor);
              fc->col_type[reg] = DW_CFA_offset;
              fc->col_offset[reg] = roffs * fc->data_factor;
              break;
 
            case DW_CFA_restore_extended:
              reg = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_restore_extended: r%d\n", reg);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_restore_extended: r%ld\n", reg);
              fc->col_type[reg] = cie->col_type[reg];
              fc->col_offset[reg] = cie->col_offset[reg];
              break;
 
            case DW_CFA_undefined:
              reg = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_undefined: r%d\n", reg);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_undefined: r%ld\n", reg);
              fc->col_type[reg] = DW_CFA_undefined;
              fc->col_offset[reg] = 0;
              break;
 
            case DW_CFA_same_value:
              reg = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_same_value: r%d\n", reg);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_same_value: r%ld\n", reg);
              fc->col_type[reg] = DW_CFA_same_value;
              fc->col_offset[reg] = 0;
              break;
@@ -7462,17 +7556,15 @@ display_debug_frames (section, start, file)
            case DW_CFA_register:
              reg = LEB ();
              roffs = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_register: r%d\n", reg);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_register: r%ld\n", reg);
              fc->col_type[reg] = DW_CFA_register;
              fc->col_offset[reg] = roffs;
              break;
 
            case DW_CFA_remember_state:
-#if FDEBUG
-             printf ("  DW_CFA_remember_state\n");
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_remember_state\n");
              rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
              rs->ncols = fc->ncols;
              rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
@@ -7484,9 +7576,8 @@ display_debug_frames (section, start, file)
              break;
 
            case DW_CFA_restore_state:
-#if FDEBUG
-             printf ("  DW_CFA_restore_state\n");
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_restore_state\n");
              rs = remembered_state;
              remembered_state = rs->next;
              frame_need_space (fc, rs->ncols-1);
@@ -7500,60 +7591,49 @@ display_debug_frames (section, start, file)
            case DW_CFA_def_cfa:
              fc->cfa_reg = LEB ();
              fc->cfa_offset = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_def_cfa: reg %d ofs %d\n", fc->cfa_reg, fc->cfa_offset);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_def_cfa: r%d ofs %d\n",
+                       fc->cfa_reg, fc->cfa_offset);
              break;
 
            case DW_CFA_def_cfa_register:
              fc->cfa_reg = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_def_cfa_reg: %d\n", fc->cfa_reg);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
              break;
 
            case DW_CFA_def_cfa_offset:
              fc->cfa_offset = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
              break;
 
            case DW_CFA_nop:
-#if FDEBUG
-             printf ("  DW_CFA_nop\n");
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_nop\n");
              break;
 
 #ifndef DW_CFA_GNU_window_save
 #define DW_CFA_GNU_window_save 0x2d
 #endif
            case DW_CFA_GNU_window_save:
-#if FDEBUG
-             printf ("  DW_CFA_GNU_window_save\n");
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_GNU_window_save\n");
              break;
 
-#ifndef DW_CFA_GNU_args_size
-#define DW_CFA_GNU_args_size 0x2e
-#endif
            case DW_CFA_GNU_args_size:
              ul = LEB ();
-#if FDEBUG
-             printf ("  DW_CFA_GNU_args_size: %d\n", ul);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
              break;
 
-#ifndef DW_CFA_GNU_negative_offset_extended
-#define DW_CFA_GNU_negative_offset_extended 0x2f
-#endif
            case DW_CFA_GNU_negative_offset_extended:
              reg = LEB ();
              l = - LEB ();
              frame_need_space (fc, reg);
-#if FDEBUG
-             printf ("  DW_CFA_GNU_negative_offset_extended: r%d = cfa[%d*%d]\n", reg, l, fc->data_factor);
-#endif
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
+                       reg, l * fc->data_factor);
              fc->col_type[reg] = DW_CFA_offset;
              fc->col_offset[reg] = l * fc->data_factor;
              break;
@@ -7564,7 +7644,8 @@ display_debug_frames (section, start, file)
            }
        }
 
-      frame_display_row (fc, &need_col_headers, &max_regs);
+      if (do_debug_frames_interp)
+        frame_display_row (fc, &need_col_headers, &max_regs);
 
       start = block_end;
     }
@@ -7627,7 +7708,6 @@ debug_displays[] =
   { ".debug_frame",       display_debug_frames, NULL },
   { ".eh_frame",          display_debug_frames, NULL },
   { ".debug_macinfo",     display_debug_not_supported, NULL },
-  { ".debug_frame",       display_debug_not_supported, NULL },
   { ".debug_str",         display_debug_not_supported, NULL },
   { ".debug_static_func", display_debug_not_supported, NULL },
   { ".debug_static_vars", display_debug_not_supported, NULL },
@@ -7657,7 +7737,7 @@ display_debug_section (section, file)
 
   /* See if we know how to display the contents of this section.  */
   if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
-    name = ".debug_info";  
+    name = ".debug_info";
 
   for (i = NUM_ELEM (debug_displays); i--;)
     if (strcmp (debug_displays[i].name, name) == 0)
@@ -7684,7 +7764,7 @@ process_section_contents (file)
      FILE * file;
 {
   Elf32_Internal_Shdr * section;
-  unsigned int         i;
+  unsigned int i;
 
   if (! do_dump)
     return 1;
@@ -8166,7 +8246,7 @@ process_note (pnote)
 {
   printf ("  %s\t\t0x%08lx\t%s\n",
          pnote->namesz ? pnote->namedata : "(NONE)",
-         pnote->descsz, get_note_type (pnote->type));
+         pnote->descsz, get_note_type (pnote->type));
   return 1;
 }
 
@@ -8318,7 +8398,7 @@ process_arch_specific (file)
   switch (elf_header.e_machine)
     {
     case EM_MIPS:
-    case EM_MIPS_RS4_BE:
+    case EM_MIPS_RS3_LE:
       return process_mips_specific (file);
       break;
     default: