Catch potential integer overflow in readelf when processing corrupt binaries.
[deliverable/binutils-gdb.git] / binutils / readelf.c
index 8e2902fdcac41201edd37c2351df3b465a533851..e785fde43e7c0de796dd77e1e689826370a3e4c6 100644 (file)
@@ -60,9 +60,7 @@
 #include "bucomm.h"
 #include "elfcomm.h"
 #include "dwarf.h"
-#ifdef HAVE_LIBCTF
 #include "ctf-api.h"
-#endif
 
 #include "elf/common.h"
 #include "elf/external.h"
@@ -186,9 +184,7 @@ typedef struct elf_section_list
 #define DEBUG_DUMP     (1 << 2)        /* The -w command line switch.  */
 #define STRING_DUMP     (1 << 3)       /* The -p command line switch.  */
 #define RELOC_DUMP      (1 << 4)       /* The -R command line switch.  */
-#ifdef HAVE_LIBCTF
 #define CTF_DUMP        (1 << 5)        /* The --ctf command line switch.  */
-#endif
 
 typedef unsigned char dump_type;
 
@@ -255,20 +251,16 @@ static bfd_boolean do_dump = FALSE;
 static bfd_boolean do_version = FALSE;
 static bfd_boolean do_histogram = FALSE;
 static bfd_boolean do_debugging = FALSE;
-#ifdef HAVE_LIBCTF
 static bfd_boolean do_ctf = FALSE;
-#endif
 static bfd_boolean do_arch = FALSE;
 static bfd_boolean do_notes = FALSE;
 static bfd_boolean do_archive_index = FALSE;
 static bfd_boolean is_32bit_elf = FALSE;
 static bfd_boolean decompress_dumps = FALSE;
 
-#ifdef HAVE_LIBCTF
 static char *dump_ctf_parent_name;
 static char *dump_ctf_symtab_name;
 static char *dump_ctf_strtab_name;
-#endif
 
 struct group_list
 {
@@ -2420,7 +2412,7 @@ get_machine_name (unsigned e_machine)
     case EM_TPC:               return "Tenor Network TPC processor";
     case EM_SNP1K:             return "Trebia SNP 1000 processor";
       /* 100 */
-    case EM_ST200:             return "STMicroelectronics ST200 microcontroller";  
+    case EM_ST200:             return "STMicroelectronics ST200 microcontroller";
     case EM_IP2K_OLD:
     case EM_IP2K:              return "Ubicom IP2xxx 8-bit microcontrollers";
     case EM_MAX:               return "MAX Processor";
@@ -2536,7 +2528,7 @@ get_machine_name (unsigned e_machine)
     case EM_MT:                 return "Morpho Techologies MT processor";
     case EM_ALPHA:             return "Alpha";
     case EM_WEBASSEMBLY:       return "Web Assembly";
-    case EM_DLX:               return "OpenDLX";  
+    case EM_DLX:               return "OpenDLX";
     case EM_XSTORMY16:         return "Sanyo XStormy16 CPU core";
     case EM_IQ2000:            return "Vitesse IQ2000";
     case EM_M32C_OLD:
@@ -3887,22 +3879,6 @@ get_parisc_segment_type (unsigned long type)
 {
   switch (type)
     {
-    case PT_HP_TLS:            return "HP_TLS";
-    case PT_HP_CORE_NONE:      return "HP_CORE_NONE";
-    case PT_HP_CORE_VERSION:   return "HP_CORE_VERSION";
-    case PT_HP_CORE_KERNEL:    return "HP_CORE_KERNEL";
-    case PT_HP_CORE_COMM:      return "HP_CORE_COMM";
-    case PT_HP_CORE_PROC:      return "HP_CORE_PROC";
-    case PT_HP_CORE_LOADABLE:  return "HP_CORE_LOADABLE";
-    case PT_HP_CORE_STACK:     return "HP_CORE_STACK";
-    case PT_HP_CORE_SHM:       return "HP_CORE_SHM";
-    case PT_HP_CORE_MMF:       return "HP_CORE_MMF";
-    case PT_HP_PARALLEL:       return "HP_PARALLEL";
-    case PT_HP_FASTBIND:       return "HP_FASTBIND";
-    case PT_HP_OPT_ANNOT:      return "HP_OPT_ANNOT";
-    case PT_HP_HSL_ANNOT:      return "HP_HSL_ANNOT";
-    case PT_HP_STACK:          return "HP_STACK";
-    case PT_HP_CORE_UTSNAME:   return "HP_CORE_UTSNAME";
     case PT_PARISC_ARCHEXT:    return "PARISC_ARCHEXT";
     case PT_PARISC_UNWIND:     return "PARISC_UNWIND";
     case PT_PARISC_WEAKORDER:  return "PARISC_WEAKORDER";
@@ -3917,10 +3893,6 @@ get_ia64_segment_type (unsigned long type)
     {
     case PT_IA_64_ARCHEXT:     return "IA_64_ARCHEXT";
     case PT_IA_64_UNWIND:      return "IA_64_UNWIND";
-    case PT_HP_TLS:            return "HP_TLS";
-    case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
-    case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
-    case PT_IA_64_HP_STACK:    return "HP_STACK";
     default:                    return NULL;
     }
 }
@@ -3935,6 +3907,44 @@ get_tic6x_segment_type (unsigned long type)
     }
 }
 
+static const char *
+get_hpux_segment_type (unsigned long type, unsigned e_machine)
+{
+  if (e_machine == EM_PARISC)
+    switch (type)
+      {
+      case PT_HP_TLS:          return "HP_TLS";
+      case PT_HP_CORE_NONE:    return "HP_CORE_NONE";
+      case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
+      case PT_HP_CORE_KERNEL:  return "HP_CORE_KERNEL";
+      case PT_HP_CORE_COMM:    return "HP_CORE_COMM";
+      case PT_HP_CORE_PROC:    return "HP_CORE_PROC";
+      case PT_HP_CORE_LOADABLE:        return "HP_CORE_LOADABLE";
+      case PT_HP_CORE_STACK:   return "HP_CORE_STACK";
+      case PT_HP_CORE_SHM:     return "HP_CORE_SHM";
+      case PT_HP_CORE_MMF:     return "HP_CORE_MMF";
+      case PT_HP_PARALLEL:     return "HP_PARALLEL";
+      case PT_HP_FASTBIND:     return "HP_FASTBIND";
+      case PT_HP_OPT_ANNOT:    return "HP_OPT_ANNOT";
+      case PT_HP_HSL_ANNOT:    return "HP_HSL_ANNOT";
+      case PT_HP_STACK:                return "HP_STACK";
+      case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
+      default:                 return NULL;
+      }
+
+  if (e_machine == EM_IA_64)
+    switch (type)
+      {
+      case PT_HP_TLS:           return "HP_TLS";
+      case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
+      case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
+      case PT_IA_64_HP_STACK:   return "HP_STACK";
+      default:                  return NULL;
+      }
+
+  return NULL;
+}
+
 static const char *
 get_solaris_segment_type (unsigned long type)
 {
@@ -3973,12 +3983,7 @@ get_segment_type (Filedata * filedata, unsigned long p_type)
     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
 
     default:
-      if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
-       {
-         sprintf (buff, "GNU_MBIND+%#lx",
-                  p_type - PT_GNU_MBIND_LO);
-       }
-      else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
+      if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
        {
          const char * result;
 
@@ -4019,24 +4024,28 @@ get_segment_type (Filedata * filedata, unsigned long p_type)
        }
       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
        {
-         const char * result;
+         const char * result = NULL;
 
-         switch (filedata->file_header.e_machine)
+         switch (filedata->file_header.e_ident[EI_OSABI])
            {
-           case EM_PARISC:
-             result = get_parisc_segment_type (p_type);
+           case ELFOSABI_GNU:
+           case ELFOSABI_FREEBSD:
+             if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
+               {
+                 sprintf (buff, "GNU_MBIND+%#lx", p_type - PT_GNU_MBIND_LO);
+                 result = buff;
+               }
              break;
-           case EM_IA_64:
-             result = get_ia64_segment_type (p_type);
+           case ELFOSABI_HPUX:
+             result = get_hpux_segment_type (p_type,
+                                             filedata->file_header.e_machine);
+             break;
+           case ELFOSABI_SOLARIS:
+             result = get_solaris_segment_type (p_type);
              break;
            default:
-             if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
-               result = get_solaris_segment_type (p_type);
-             else
-               result = NULL;
              break;
            }
-
          if (result != NULL)
            return result;
 
@@ -4409,12 +4418,10 @@ get_section_type_name (Filedata * filedata, unsigned int sh_type)
 #define OPTION_DWARF_DEPTH     514
 #define OPTION_DWARF_START     515
 #define OPTION_DWARF_CHECK     516
-#ifdef HAVE_LIBCTF
 #define OPTION_CTF_DUMP                517
 #define OPTION_CTF_PARENT      518
 #define OPTION_CTF_SYMBOLS     519
 #define OPTION_CTF_STRINGS     520
-#endif
 
 static struct option options[] =
 {
@@ -4453,13 +4460,11 @@ static struct option options[] =
   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
 
-#ifdef HAVE_LIBCTF
   {"ctf",              required_argument, 0, OPTION_CTF_DUMP},
 
   {"ctf-symbols",      required_argument, 0, OPTION_CTF_SYMBOLS},
   {"ctf-strings",      required_argument, 0, OPTION_CTF_STRINGS},
   {"ctf-parent",       required_argument, 0, OPTION_CTF_PARENT},
-#endif
 
   {"version",         no_argument, 0, 'v'},
   {"wide",            no_argument, 0, 'W'},
@@ -4510,7 +4515,6 @@ usage (FILE * stream)
   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
                          or deeper\n"));
-#ifdef HAVE_LIBCTF
   fprintf (stream, _("\
   --ctf=<number|name>    Display CTF info from section <number|name>\n\
   --ctf-parent=<number|name>\n\
@@ -4519,7 +4523,6 @@ usage (FILE * stream)
                          Use section <number|name> as the CTF external symtab\n\n\
   --ctf-strings=<number|name>\n\
                          Use section <number|name> as the CTF external strtab\n\n"));
-#endif
 
 #ifdef SUPPORT_DISASSEMBLY
   fprintf (stream, _("\
@@ -4748,7 +4751,6 @@ parse_args (Filedata * filedata, int argc, char ** argv)
        case OPTION_DWARF_CHECK:
          dwarf_check = TRUE;
          break;
-#ifdef HAVE_LIBCTF
        case OPTION_CTF_DUMP:
          do_ctf = TRUE;
          request_dump (filedata, CTF_DUMP);
@@ -4762,7 +4764,6 @@ parse_args (Filedata * filedata, int argc, char ** argv)
        case OPTION_CTF_PARENT:
          dump_ctf_parent_name = strdup (optarg);
          break;
-#endif
        case OPTION_DYN_SYMS:
          do_dyn_syms = TRUE;
          break;
@@ -7414,11 +7415,6 @@ struct absaddr
   bfd_vma offset;
 };
 
-#define ABSADDR(a) \
-  ((a).section \
-   ? filedata->section_headers [(a).section].sh_addr + (a).offset \
-   : (a).offset)
-
 /* Find the nearest symbol at or below ADDR.  Returns the symbol
    name, if found, and the offset from the symbol to ADDR.  */
 
@@ -7564,8 +7560,21 @@ dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
       if (aux->info == NULL)
        continue;
 
+      offset = tp->info.offset;
+      if (tp->info.section)
+       {
+         if (tp->info.section >= filedata->file_header.e_shnum)
+           {
+             warn (_("Invalid section %u in table entry %ld\n"),
+                   tp->info.section, (long) (tp - aux->table));
+             res = FALSE;
+             continue;
+           }
+         offset += filedata->section_headers[tp->info.section].sh_addr;
+       }
+      offset -= aux->info_addr;
       /* PR 17531: file: 0997b4d1.  */
-      if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
+      if (offset >= aux->info_size)
        {
          warn (_("Invalid offset %lx in table entry %ld\n"),
                (long) tp->info.offset, (long) (tp - aux->table));
@@ -7573,7 +7582,7 @@ dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
          continue;
        }
 
-      head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
+      head = aux->info + offset;
       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
 
       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
@@ -9045,6 +9054,11 @@ decode_arm_unwind (Filedata *                 filedata,
 
       remaining = 4;
     }
+  else
+    {
+      addr.section = SHN_UNDEF;
+      addr.offset = 0;
+    }
 
   if ((word & 0x80000000) == 0)
     {
@@ -11063,9 +11077,7 @@ get_symbol_binding (Filedata * filedata, unsigned int binding)
       else if (binding >= STB_LOOS && binding <= STB_HIOS)
        {
          if (binding == STB_GNU_UNIQUE
-             && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
-                 /* GNU is still using the default value 0.  */
-                 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
+             && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU)
            return "UNIQUE";
          snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
        }
@@ -11117,9 +11129,7 @@ get_symbol_type (Filedata * filedata, unsigned int type)
 
          if (type == STT_GNU_IFUNC
              && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
-                 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
-                 /* GNU is still using the default value 0.  */
-                 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
+                 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD))
            return "IFUNC";
 
          snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
@@ -11145,6 +11155,19 @@ get_symbol_visibility (unsigned int visibility)
     }
 }
 
+static const char *
+get_alpha_symbol_other (unsigned int other)
+{
+  switch (other)
+    {
+    case STO_ALPHA_NOPV:       return "NOPV";
+    case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
+    default:
+      error (_("Unrecognized alpah specific other value: %u"), other);
+      return _("<unknown>");
+    }
+}
+
 static const char *
 get_solaris_symbol_visibility (unsigned int visibility)
 {
@@ -11284,6 +11307,9 @@ get_symbol_other (Filedata * filedata, unsigned int other)
 
   switch (filedata->file_header.e_machine)
     {
+    case EM_ALPHA:
+      result = get_alpha_symbol_other (other);
+      break;
     case EM_AARCH64:
       result = get_aarch64_symbol_other (other);
       break;
@@ -11544,7 +11570,7 @@ get_symbol_version_string (Filedata *                   filedata,
 
       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
        {
-         if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
+         if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
            return NULL;
 
          off -= ivd.vd_next;
@@ -12593,7 +12619,7 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_OR1K:
       return reloc_type == 1; /* R_OR1K_32.  */
     case EM_PARISC:
-      return (reloc_type == 1 /* R_PARISC_DIR32.  */         
+      return (reloc_type == 1 /* R_PARISC_DIR32.  */
              || reloc_type == 2 /* R_PARISC_DIR21L.  */
              || reloc_type == 41); /* R_PARISC_SECREL32.  */
     case EM_PJ:
@@ -12733,6 +12759,8 @@ is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_L1OM:
     case EM_K1OM:
       return reloc_type == 2;  /* R_X86_64_PC32.  */
+    case EM_VAX:
+      return reloc_type == 4;  /* R_VAX_PCREL32.  */
     case EM_XTENSA_OLD:
     case EM_XTENSA:
       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
@@ -13338,7 +13366,7 @@ apply_relocations (Filedata *                 filedata,
            }
 
          rloc = start + rp->r_offset;
-         if ((rloc + reloc_size) > end || (rloc < start))
+         if (rloc >= end || (rloc + reloc_size) > end || (rloc < start))
            {
              warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
                    (unsigned long) rp->r_offset,
@@ -13824,7 +13852,6 @@ dump_section_as_bytes (Elf_Internal_Shdr *  section,
   return TRUE;
 }
 
-#ifdef HAVE_LIBCTF
 static ctf_sect_t *
 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
 {
@@ -13842,10 +13869,10 @@ shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
 static char *dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
                                    char *s, void *arg)
 {
-  char *spaces = arg;
+  const char *blanks = arg;
   char *new_s;
 
-  if (asprintf (&new_s, "%s%s", spaces, s) < 0)
+  if (asprintf (&new_s, "%s%s", blanks, s) < 0)
     return s;
   return new_s;
 }
@@ -13978,7 +14005,6 @@ dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
   free (strdata);
   return ret;
 }
-#endif /* HAVE_LIBCTF */
 
 static bfd_boolean
 load_specific_debug_section (enum dwarf_section_display_enum  debug,
@@ -13988,7 +14014,7 @@ load_specific_debug_section (enum dwarf_section_display_enum  debug,
   struct dwarf_section * section = &debug_displays [debug].section;
   char buf [64];
   Filedata * filedata = (Filedata *) data;
-  
+
   if (section->start != NULL)
     {
       /* If it is already loaded, do nothing.  */
@@ -14318,13 +14344,11 @@ process_section_contents (Filedata * filedata)
            res = FALSE;
        }
 
-#ifdef HAVE_LIBCTF
       if (dump & CTF_DUMP)
        {
          if (! dump_section_as_ctf (section, filedata))
            res = FALSE;
        }
-#endif
     }
 
   /* Check to see if the user requested a
@@ -16457,8 +16481,6 @@ process_mips_specific (Filedata * filedata)
   if (options_offset != 0)
     {
       Elf_External_Options * eopt;
-      Elf_Internal_Options * iopt;
-      Elf_Internal_Options * option;
       size_t offset;
       int cnt;
       sect = filedata->section_headers;
@@ -16482,6 +16504,10 @@ process_mips_specific (Filedata * filedata)
                                                 sect->sh_size, _("options"));
       if (eopt)
        {
+         Elf_Internal_Options * iopt;
+         Elf_Internal_Options * option;
+         Elf_Internal_Options * iopt_end;
+
          iopt = (Elf_Internal_Options *)
               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
          if (iopt == NULL)
@@ -16492,7 +16518,8 @@ process_mips_specific (Filedata * filedata)
 
          offset = cnt = 0;
          option = iopt;
-
+         iopt_end = iopt + (sect->sh_size / sizeof (eopt));
+         
          while (offset <= sect->sh_size - sizeof (* eopt))
            {
              Elf_External_Options * eoption;
@@ -16535,15 +16562,25 @@ process_mips_specific (Filedata * filedata)
                  /* This shouldn't happen.  */
                  printf (" NULL       %d %lx", option->section, option->info);
                  break;
+
                case ODK_REGINFO:
                  printf (" REGINFO    ");
                  if (filedata->file_header.e_machine == EM_MIPS)
                    {
-                     /* 32bit form.  */
                      Elf32_External_RegInfo * ereg;
                      Elf32_RegInfo reginfo;
 
+                     /* 32bit form.  */
+                     if (option + 2 > iopt_end)
+                       {
+                         printf (_("<corrupt>\n"));
+                         error (_("Truncated MIPS REGINFO option\n"));
+                         cnt = 0;
+                         break;
+                       }
+
                      ereg = (Elf32_External_RegInfo *) (option + 1);
+
                      reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
                      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
                      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
@@ -16564,6 +16601,14 @@ process_mips_specific (Filedata * filedata)
                      Elf64_External_RegInfo * ereg;
                      Elf64_Internal_RegInfo reginfo;
 
+                     if (option + 2 > iopt_end)
+                       {
+                         printf (_("<corrupt>\n"));
+                         error (_("Truncated MIPS REGINFO option\n"));
+                         cnt = 0;
+                         break;
+                       }
+
                      ereg = (Elf64_External_RegInfo *) (option + 1);
                      reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
                      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
@@ -16583,6 +16628,7 @@ process_mips_specific (Filedata * filedata)
                    }
                  ++option;
                  continue;
+
                case ODK_EXCEPTIONS:
                  fputs (" EXCEPTIONS fpe_min(", stdout);
                  process_mips_fpe_exception (option->info & OEX_FPU_MIN);
@@ -16599,6 +16645,7 @@ process_mips_specific (Filedata * filedata)
                  if (option->info & OEX_DISMISS)
                    fputs (" DISMISS", stdout);
                  break;
+
                case ODK_PAD:
                  fputs (" PAD       ", stdout);
                  if (option->info & OPAD_PREFIX)
@@ -16608,6 +16655,7 @@ process_mips_specific (Filedata * filedata)
                  if (option->info & OPAD_SYMBOL)
                    fputs (" SYMBOL", stdout);
                  break;
+
                case ODK_HWPATCH:
                  fputs (" HWPATCH   ", stdout);
                  if (option->info & OHW_R4KEOP)
@@ -16619,14 +16667,17 @@ process_mips_specific (Filedata * filedata)
                  if (option->info & OHW_R5KCVTL)
                    fputs (" R5KCVTL", stdout);
                  break;
+
                case ODK_FILL:
                  fputs (" FILL       ", stdout);
                  /* XXX Print content of info word?  */
                  break;
+
                case ODK_TAGS:
                  fputs (" TAGS       ", stdout);
                  /* XXX Print content of info word?  */
                  break;
+
                case ODK_HWAND:
                  fputs (" HWAND     ", stdout);
                  if (option->info & OHWA0_R4KEOP_CHECKED)
@@ -16634,6 +16685,7 @@ process_mips_specific (Filedata * filedata)
                  if (option->info & OHWA0_R4KEOP_CLEAN)
                    fputs (" R4KEOP_CLEAN", stdout);
                  break;
+
                case ODK_HWOR:
                  fputs (" HWOR      ", stdout);
                  if (option->info & OHWA0_R4KEOP_CHECKED)
@@ -16641,16 +16693,19 @@ process_mips_specific (Filedata * filedata)
                  if (option->info & OHWA0_R4KEOP_CLEAN)
                    fputs (" R4KEOP_CLEAN", stdout);
                  break;
+
                case ODK_GP_GROUP:
                  printf (" GP_GROUP  %#06lx  self-contained %#06lx",
                          option->info & OGP_GROUP,
                          (option->info & OGP_SELF) >> 16);
                  break;
+
                case ODK_IDENT:
                  printf (" IDENT     %#06lx  self-contained %#06lx",
                          option->info & OGP_GROUP,
                          (option->info & OGP_SELF) >> 16);
                  break;
+
                default:
                  /* This shouldn't happen.  */
                  printf (" %3d ???     %d %lx",
@@ -17952,7 +18007,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
     case NT_GNU_PROPERTY_TYPE_0:
       print_gnu_property_note (filedata, pnote);
       break;
-      
+
     default:
       /* Handle unrecognised types.  An error message should have already been
         created by get_gnu_elf_note_type(), so all that we need to do is to
@@ -18072,10 +18127,23 @@ process_netbsd_elf_note (Elf_Internal_Note * pnote)
       return TRUE;
 
     case NT_NETBSD_MARCH:
-      printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
+      printf ("  NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
              pnote->descdata);
       return TRUE;
 
+#ifdef   NT_NETBSD_PAX
+    case NT_NETBSD_PAX:
+      version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
+      printf ("  NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
+             ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
+             ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
+             ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
+             ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
+             ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
+             ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
+      return TRUE;
+#endif
+
     default:
       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
              pnote->type);
@@ -18119,18 +18187,29 @@ get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
 {
   static char buff[64];
 
-  if (e_type == NT_NETBSDCORE_PROCINFO)
-    return _("NetBSD procinfo structure");
+  switch (e_type)
+    {
+    case NT_NETBSDCORE_PROCINFO:
+      /* NetBSD core "procinfo" structure.  */
+      return _("NetBSD procinfo structure");
 
-  /* As of Jan 2002 there are no other machine-independent notes
-     defined for NetBSD core files.  If the note type is less
-     than the start of the machine-dependent note types, we don't
-     understand it.  */
+#ifdef NT_NETBSDCORE_AUXV
+    case NT_NETBSDCORE_AUXV:
+      return _("NetBSD ELF auxiliary vector data");
+#endif
 
-  if (e_type < NT_NETBSDCORE_FIRSTMACH)
-    {
-      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
-      return buff;
+    default:
+      /* As of Jan 2002 there are no other machine-independent notes
+        defined for NetBSD core files.  If the note type is less
+        than the start of the machine-dependent note types, we don't
+        understand it.  */
+
+      if (e_type < NT_NETBSDCORE_FIRSTMACH)
+       {
+         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
+         return buff;
+       }
+      break;
     }
 
   switch (filedata->file_header.e_machine)
@@ -18154,6 +18233,23 @@ get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
        }
       break;
 
+    /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
+       There's also old PT___GETREGS40 == mach + 1 for old reg
+       structure which lacks GBR.  */
+    case EM_SH:
+      switch (e_type)
+       {
+       case NT_NETBSDCORE_FIRSTMACH + 1:
+         return _("PT___GETREGS40 (old reg structure)");
+       case NT_NETBSDCORE_FIRSTMACH + 3:
+         return _("PT_GETREGS (reg structure)");
+       case NT_NETBSDCORE_FIRSTMACH + 5:
+         return _("PT_GETFPREGS (fpreg structure)");
+       default:
+         break;
+       }
+      break;
+
     /* On all other arch's, PT_GETREGS == mach+1 and
        PT_GETFPREGS == mach+3.  */
     default:
@@ -18236,7 +18332,7 @@ print_stapsdt_note (Elf_Internal_Note *pnote)
     }
   else
     goto stapdt_note_too_small;
-  
+
   if (data >= data_end)
     goto stapdt_note_too_small;
   maxlen = data_end - data;
@@ -18563,7 +18659,7 @@ same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
 
   a1 = find_section_by_address (filedata, addr1);
   a2 = find_section_by_address (filedata, addr2);
-  
+
   return a1 == a2 && a1 != NULL;
 }
 
@@ -18627,7 +18723,7 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
       start = byte_get ((unsigned char *) pnote->descdata, 8);
       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
       break;
-      
+
     default:
       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
       printf (_("    <invalid descsz>"));
@@ -18922,7 +19018,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
 
   if (do_wide && left > 0)
     printf ("%-*s", left, " ");
-    
+
   return TRUE;
 }
 
@@ -18960,6 +19056,10 @@ process_note (Elf_Internal_Note *  pnote,
     /* NetBSD-specific core file notes.  */
     return process_netbsd_elf_note (pnote);
 
+  else if (const_strneq (pnote->namedata, "PaX"))
+    /* NetBSD-specific core file notes.  */
+    return process_netbsd_elf_note (pnote);
+
   else if (strneq (pnote->namedata, "SPU/", 4))
     {
       /* SPU-specific core file notes.  */
@@ -19943,7 +20043,7 @@ process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
          /* PR 24049 - we cannot use filedata->file_name as this will
             have already been freed.  */
          error (_("%s: failed to read archive header\n"), arch.file_name);
-           
+
           ret = FALSE;
           break;
         }
@@ -20037,7 +20137,7 @@ process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
 
          thin_filedata.handle = nested_arch.file;
          thin_filedata.file_name = qualified_name;
-         
+
           if (! process_object (& thin_filedata))
            ret = FALSE;
         }
@@ -20204,11 +20304,9 @@ main (int argc, char ** argv)
   if (cmdline.dump_sects != NULL)
     free (cmdline.dump_sects);
 
-#ifdef HAVE_LIBCTF
   free (dump_ctf_symtab_name);
   free (dump_ctf_strtab_name);
   free (dump_ctf_parent_name);
-#endif
 
   return err ? EXIT_FAILURE : EXIT_SUCCESS;
 }
This page took 0.041127 seconds and 4 git commands to generate.