Don't exceed reloc array bounds
[deliverable/binutils-gdb.git] / bfd / elf32-ppc.c
index 092b1ced8dde03e63ca9a1c5c989dba7628cc762..182dc2a845887ad3e35778f847adc160bddacb8f 100644 (file)
@@ -2014,7 +2014,7 @@ ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Set the howto pointer for a PowerPC ELF reloc.  */
 
-static void
+static bfd_boolean
 ppc_elf_info_to_howto (bfd *abfd,
                       arelent *cache_ptr,
                       Elf_Internal_Rela *dst)
@@ -2029,24 +2029,27 @@ ppc_elf_info_to_howto (bfd *abfd,
   if (r_type >= R_PPC_max)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: unrecognised PPC reloc number: %d"),
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
                          abfd, r_type);
       bfd_set_error (bfd_error_bad_value);
-      r_type = R_PPC_NONE;
+      return FALSE;
     }
+
   cache_ptr->howto = ppc_elf_howto_table[r_type];
 
   /* Just because the above assert didn't trigger doesn't mean that
      ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation.  */
-  if (!cache_ptr->howto)
+  if (cache_ptr->howto == NULL)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: invalid relocation type %d"),
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
                          abfd, r_type);
       bfd_set_error (bfd_error_bad_value);
 
-      cache_ptr->howto = ppc_elf_howto_table[R_PPC_NONE];
+      return FALSE;
     }
+
+  return TRUE;
 }
 
 /* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
@@ -2734,7 +2737,7 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
        continue;
 
       /* xgettext:c-format */
-      error_message = _("corrupt %s section in %B");
+      error_message = _("corrupt %s section in %pB");
       length = asec->size;
       if (length < 20)
        goto fail;
@@ -2754,7 +2757,7 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
          || (bfd_bread (buffer, length, ibfd) != length))
        {
          /* xgettext:c-format */
-         error_message = _("unable to read in %s section from %B");
+         error_message = _("unable to read in %s section from %pB");
          goto fail;
        }
 
@@ -2796,7 +2799,7 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
        {
          ibfd = abfd;
          /* xgettext:c-format */
-         error_message = _("warning: unable to set size of %s section in %B");
+         error_message = _("warning: unable to set size of %s section in %pB");
        }
     }
 
@@ -2846,7 +2849,7 @@ ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
   if (buffer == NULL)
     {
       _bfd_error_handler
-       (_("failed to allocate space for new APUinfo section."));
+       (_("failed to allocate space for new APUinfo section"));
       return;
     }
 
@@ -2865,10 +2868,10 @@ ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
     }
 
   if (length != asec->size)
-    _bfd_error_handler (_("failed to compute new APUinfo section."));
+    _bfd_error_handler (_("failed to compute new APUinfo section"));
 
   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
-    _bfd_error_handler (_("failed to install new APUinfo section."));
+    _bfd_error_handler (_("failed to install new APUinfo section"));
 
   free (buffer);
 
@@ -3925,7 +3928,7 @@ bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
 {
   _bfd_error_handler
     /* xgettext:c-format */
-    (_("%B: relocation %s cannot be used when making a shared object"),
+    (_("%pB: relocation %s cannot be used when making a shared object"),
      abfd,
      ppc_elf_howto_table[r_type]->name);
   bfd_set_error (bfd_error_bad_value);
@@ -3962,7 +3965,7 @@ ppc_elf_check_relocs (bfd *abfd,
     return TRUE;
 
 #ifdef DEBUG
-  _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
+  _bfd_error_handler ("ppc_elf_check_relocs called for section %pA in %pB",
                      sec, abfd);
 #endif
 
@@ -4638,21 +4641,21 @@ _bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
       else if (out_fp != 2 && in_fp == 2)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
+         (_("warning: %pB uses hard float, %pB uses soft float"), obfd, ibfd);
       else if (out_fp == 2 && in_fp != 2)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
+         (_("warning: %pB uses hard float, %pB uses soft float"), ibfd, obfd);
       else if (out_fp == 1 && in_fp == 3)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses double-precision hard float, "
-            "%B uses single-precision hard float"), obfd, ibfd);
+         (_("warning: %pB uses double-precision hard float, "
+            "%pB uses single-precision hard float"), obfd, ibfd);
       else if (out_fp == 3 && in_fp == 1)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses double-precision hard float, "
-            "%B uses single-precision hard float"), ibfd, obfd);
+         (_("warning: %pB uses double-precision hard float, "
+            "%pB uses single-precision hard float"), ibfd, obfd);
 
       in_fp = in_attr->i & 0xc;
       out_fp = out_attr->i & 0xc;
@@ -4666,23 +4669,23 @@ _bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
       else if (out_fp != 2 * 4 && in_fp == 2 * 4)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses 64-bit long double, "
-            "%B uses 128-bit long double"), ibfd, obfd);
+         (_("warning: %pB uses 64-bit long double, "
+            "%pB uses 128-bit long double"), ibfd, obfd);
       else if (in_fp != 2 * 4 && out_fp == 2 * 4)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses 64-bit long double, "
-            "%B uses 128-bit long double"), obfd, ibfd);
+         (_("warning: %pB uses 64-bit long double, "
+            "%pB uses 128-bit long double"), obfd, ibfd);
       else if (out_fp == 1 * 4 && in_fp == 3 * 4)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses IBM long double, "
-            "%B uses IEEE long double"), ibfd, obfd);
+         (_("warning: %pB uses IBM long double, "
+            "%pB uses IEEE long double"), ibfd, obfd);
       else if (out_fp == 3 * 4 && in_fp == 1 * 4)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses IBM long double, "
-            "%B uses IEEE long double"), obfd, ibfd);
+         (_("warning: %pB uses IBM long double, "
+            "%pB uses IEEE long double"), obfd, ibfd);
     }
 }
 
@@ -4732,12 +4735,12 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
       else if (out_vec < in_vec)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses AltiVec vector ABI, %B uses SPE vector ABI"),
+         (_("warning: %pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
           obfd, ibfd);
       else if (out_vec > in_vec)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses AltiVec vector ABI, %B uses SPE vector ABI"),
+         (_("warning: %pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
           ibfd, obfd);
     }
 
@@ -4760,13 +4763,13 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
       else if (out_struct < in_struct)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses r3/r4 for small structure returns, "
-            "%B uses memory"), obfd, ibfd);
+         (_("warning: %pB uses r3/r4 for small structure returns, "
+            "%pB uses memory"), obfd, ibfd);
       else if (out_struct > in_struct)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("Warning: %B uses r3/r4 for small structure returns, "
-            "%B uses memory"), ibfd, obfd);
+         (_("warning: %pB uses r3/r4 for small structure returns, "
+            "%pB uses memory"), ibfd, obfd);
     }
 
   /* Merge Tag_compatibility attributes and any common GNU ones.  */
@@ -4820,7 +4823,7 @@ ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
        {
          error = TRUE;
          _bfd_error_handler
-           (_("%B: compiled with -mrelocatable and linked with "
+           (_("%pB: compiled with -mrelocatable and linked with "
               "modules compiled normally"), ibfd);
        }
       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
@@ -4828,7 +4831,7 @@ ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
        {
          error = TRUE;
          _bfd_error_handler
-           (_("%B: compiled normally and linked with "
+           (_("%pB: compiled normally and linked with "
               "modules compiled with -mrelocatable"), ibfd);
        }
 
@@ -4856,7 +4859,7 @@ ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
          error = TRUE;
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: uses different e_flags (%#x) fields "
+           (_("%pB: uses different e_flags (%#x) fields "
               "than previous modules (%#x)"),
             ibfd, new_flags, old_flags);
        }
@@ -4897,7 +4900,7 @@ ppc_elf_vle_split16 (bfd *input_bfd,
          else
            _bfd_error_handler
              /* xgettext:c-format */
-             (_("%B(%A+0x%lx): expected 16A style relocation on 0x%08x insn"),
+             (_("%pB(%pA+0x%lx): expected 16A style relocation on 0x%08x insn"),
               input_bfd, input_section, offset, opcode);
        }
     }
@@ -4916,7 +4919,7 @@ ppc_elf_vle_split16 (bfd *input_bfd,
          else
            _bfd_error_handler
              /* xgettext:c-format */
-             (_("%B(%A+0x%lx): expected 16D style relocation on 0x%08x insn"),
+             (_("%pB(%pA+0x%lx): expected 16D style relocation on 0x%08x insn"),
               input_bfd, input_section, offset, opcode);
        }
     }
@@ -5007,10 +5010,9 @@ ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->plt_type == PLT_OLD && htab->params->plt_style == PLT_NEW)
     {
       if (htab->old_bfd != NULL)
-       info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"),
-                               htab->old_bfd);
+       _bfd_error_handler (_("bss-plt forced due to %pB"), htab->old_bfd);
       else
-       info->callbacks->einfo (_("%P: bss-plt forced by profiling\n"));
+       _bfd_error_handler (_("bss-plt forced by profiling"));
     }
 
   BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
@@ -6163,7 +6165,7 @@ maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
 
       info->flags |= DF_TEXTREL;
       info->callbacks->minfo
-       (_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
+       (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
         sec->owner, h->root.root.string, sec);
 
       /* Not an error, just cut short the traversal.  */
@@ -6271,7 +6273,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
                      == (SEC_READONLY | SEC_ALLOC))
                    {
                      info->flags |= DF_TEXTREL;
-                     info->callbacks->minfo (_("%B: dynamic relocation in read-only section `%A'\n"),
+                     info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
                                              p->sec->owner, p->sec);
                    }
                }
@@ -7695,7 +7697,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
   struct ppc_elf_relax_info *relax_info = NULL;
 
 #ifdef DEBUG
-  _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
+  _bfd_error_handler ("ppc_elf_relocate_section called for %pB section %pA, "
                      "%ld relocations%s",
                      input_bfd, input_section,
                      (long) input_section->reloc_count,
@@ -7998,7 +8000,8 @@ ppc_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC_TLSGD:
-         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
+         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
              bfd_vma offset = rel->r_offset;
@@ -8025,7 +8028,8 @@ ppc_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC_TLSLD:
-         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
+         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
 
@@ -8161,8 +8165,9 @@ ppc_elf_relocate_section (bfd *output_bfd,
              else
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B(%A+%#Lx): error: %s with unexpected instruction %#x"),
-                  input_bfd, input_section, rel->r_offset,
+                 (_("%pB(%pA+%#" PRIx64 "): error: "
+                    "%s with unexpected instruction %#x"),
+                  input_bfd, input_section, (uint64_t) rel->r_offset,
                   "R_PPC_ADDR16_HA", insn);
            }
          else if (r_type == R_PPC_ADDR16_LO)
@@ -8196,8 +8201,9 @@ ppc_elf_relocate_section (bfd *output_bfd,
              else
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B(%A+%#Lx): error: %s with unexpected instruction %#x"),
-                  input_bfd, input_section, rel->r_offset,
+                 (_("%pB(%pA+%#" PRIx64 "): error: "
+                    "%s with unexpected instruction %#x"),
+                  input_bfd, input_section, (uint64_t) rel->r_offset,
                   "R_PPC_ADDR16_LO", insn);
            }
        }
@@ -8339,10 +8345,9 @@ ppc_elf_relocate_section (bfd *output_bfd,
       switch (r_type)
        {
        default:
-         info->callbacks->einfo
-           /* xgettext:c-format */
-           (_("%P: %B: unknown relocation type %d for symbol %s\n"),
-            input_bfd, (int) r_type, sym_name);
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, howto->name);
 
          bfd_set_error (bfd_error_bad_value);
          ret = FALSE;
@@ -9097,10 +9102,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
            if (!(strcmp (name, ".sdata") == 0
                  || strcmp (name, ".sbss") == 0))
              {
-               info->callbacks->einfo
+               _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%P: %B: the target (%s) of a %s relocation is "
-                    "in the wrong output section (%s)\n"),
+                 (_("%pB: the target (%s) of a %s relocation is "
+                    "in the wrong output section (%s)"),
                   input_bfd,
                   sym_name,
                   howto->name,
@@ -9128,10 +9133,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
            if (!(strcmp (name, ".sdata2") == 0
                  || strcmp (name, ".sbss2") == 0))
              {
-               info->callbacks->einfo
+               _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%P: %B: the target (%s) of a %s relocation is "
-                    "in the wrong output section (%s)\n"),
+                 (_("%pB: the target (%s) of a %s relocation is "
+                    "in the wrong output section (%s)"),
                   input_bfd,
                   sym_name,
                   howto->name,
@@ -9219,10 +9224,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
              }
            else
              {
-               info->callbacks->einfo
+               _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%P: %B: the target (%s) of a %s relocation is "
-                    "in the wrong output section (%s)\n"),
+                 (_("%pB: the target (%s) of a %s relocation is "
+                    "in the wrong output section (%s)"),
                   input_bfd,
                   sym_name,
                   howto->name,
@@ -9309,7 +9314,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
              {
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B: the target (%s) of a %s relocation is "
+                 (_("%pB: the target (%s) of a %s relocation is "
                     "in the wrong output section (%s)"),
                   input_bfd,
                   sym_name,
@@ -9415,12 +9420,9 @@ ppc_elf_relocate_section (bfd *output_bfd,
        case R_PPC_EMB_RELST_HI:
        case R_PPC_EMB_RELST_HA:
        case R_PPC_EMB_BIT_FLD:
-         info->callbacks->einfo
-           /* xgettext:c-format */
-           (_("%P: %B: relocation %s is not yet supported for symbol %s\n"),
-            input_bfd,
-            howto->name,
-            sym_name);
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, howto->name);
 
          bfd_set_error (bfd_error_invalid_operation);
          ret = FALSE;
@@ -10405,11 +10407,10 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
       else
        {
          /* xgettext:c-format */
-         info->callbacks->einfo (_("%P: %s not defined in linker created %s\n"),
-                                 htab->elf.hgot->root.root.string,
-                                 (htab->elf.sgotplt != NULL
-                                  ? htab->elf.sgotplt->name
-                                  : htab->elf.sgot->name));
+         _bfd_error_handler (_("%s not defined in linker created %pA"),
+                             htab->elf.hgot->root.root.string,
+                             (htab->elf.sgotplt != NULL
+                              ? htab->elf.sgotplt : htab->elf.sgot));
          bfd_set_error (bfd_error_bad_value);
          ret = FALSE;
        }
This page took 0.033272 seconds and 4 git commands to generate.