Update check for invalid values in pe_bfd_read_buildid function.
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
index 2eb3dd3363cc03755b664f4b436e4e69be016b69..d279e0b94c0f358fa29f17284e808cf75b1f03fb 100644 (file)
@@ -5310,6 +5310,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
   bfd_boolean target_is_micromips_code_p = FALSE;
   struct mips_elf_link_hash_table *htab;
   bfd *dynobj;
+  bfd_boolean resolved_to_zero;
 
   dynobj = elf_hash_table (info)->dynobj;
   htab = mips_elf_hash_table (info);
@@ -5456,7 +5457,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
        {
          /* If this is a dynamic link, we should have created a
             _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
-            in in _bfd_mips_elf_create_dynamic_sections.
+            in _bfd_mips_elf_create_dynamic_sections.
             Otherwise, we should define the symbol with a value of 0.
             FIXME: It should probably get into the symbol table
             somehow as well.  */
@@ -5665,6 +5666,10 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
       addend = 0;
     }
 
+  resolved_to_zero = (h != NULL
+                     && UNDEFWEAK_NO_DYNAMIC_RELOC (info,
+                                                         &h->root));
+
   /* If we haven't already determined the GOT offset, and we're going
      to need it, get it now.  */
   switch (r_type)
@@ -5796,7 +5801,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
          && r_symndx != STN_UNDEF
          && (h == NULL
              || h->root.root.type != bfd_link_hash_undefweak
-             || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
+             || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
+                 && !resolved_to_zero))
          && (input_section->flags & SEC_ALLOC) != 0)
        {
          /* If we're creating a shared library, then we can't know
@@ -6414,6 +6420,7 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
       bfd_boolean ok = FALSE;
       bfd_vma opcode = x >> 16;
       bfd_vma jalx_opcode = 0;
+      bfd_vma sign_bit = 0;
       bfd_vma addr;
       bfd_vma dest;
 
@@ -6421,12 +6428,14 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
        {
          ok = opcode == 0x4060;
          jalx_opcode = 0x3c;
+         sign_bit = 0x10000;
          value <<= 1;
        }
       else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
        {
          ok = opcode == 0x411;
          jalx_opcode = 0x1d;
+         sign_bit = 0x20000;
          value <<= 2;
        }
 
@@ -6436,7 +6445,8 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
                  + input_section->output_offset
                  + relocation->r_offset
                  + 4);
-         dest = addr + (((value & 0x3ffff) ^ 0x20000) - 0x20000);
+         dest = (addr
+                 + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
 
          if ((addr >> 28) << 28 != (dest >> 28) << 28)
            {
@@ -6955,7 +6965,7 @@ _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
          {
            asym->section = section;
            /* MIPS_TEXT is a bit special, the address is not an offset
-              to the base of the .text section.  So substract the section
+              to the base of the .text section.  So subtract the section
               base address to make it an offset.  */
            asym->value -= section->vma;
          }
@@ -6970,7 +6980,7 @@ _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
          {
            asym->section = section;
            /* MIPS_DATA is a bit special, the address is not an offset
-              to the base of the .data section.  So substract the section
+              to the base of the .data section.  So subtract the section
               base address to make it an offset.  */
            asym->value -= section->vma;
          }
@@ -8456,8 +8466,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: GOT reloc at 0x%lx not expected in executables"),
-                abfd, (unsigned long) rel->r_offset);
+               (_("%B: GOT reloc at %#Lx not expected in executables"),
+                abfd, rel->r_offset);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -8594,8 +8604,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
-                abfd, (unsigned long) rel->r_offset);
+               (_("%B: CALL16 reloc at %#Lx not against global symbol"),
+                abfd, rel->r_offset);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -8936,7 +8946,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
        {
          /* Do not copy relocations for undefined weak symbols with
             non-default visibility.  */
-         if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+         if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+             || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
            do_copy = FALSE;
 
          /* Make sure undefined weak symbols are output as a dynamic
@@ -10137,7 +10148,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                      _bfd_error_handler
                        /* xgettext:c-format */
                        (_("%B: Can't find matching LO16 reloc against `%s'"
-                          " for %s at 0x%lx in section `%A'"),
+                          " for %s at %#Lx in section `%A'"),
                         input_bfd, name,
                         howto->name, rel->r_offset, input_section);
                    }
@@ -10680,11 +10691,11 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B: `%A' offset of %ld from `%A' "
+                   (_("%B: `%A' offset of %Ld from `%A' "
                       "beyond the range of ADDIUPC"),
                     output_bfd,
                     htab->root.sgotplt->output_section,
-                    (long) gotpc_offset,
+                    gotpc_offset,
                     htab->root.splt->output_section);
                  bfd_set_error (bfd_error_no_error);
                  return FALSE;
@@ -11248,10 +11259,10 @@ mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: `%A' offset of %ld from `%A' beyond the range of ADDIUPC"),
+           (_("%B: `%A' offset of %Ld from `%A' beyond the range of ADDIUPC"),
             output_bfd,
             htab->root.sgotplt->output_section,
-            (long) gotpc_offset,
+            gotpc_offset,
             htab->root.splt->output_section);
          bfd_set_error (bfd_error_no_error);
          return FALSE;
@@ -12428,66 +12439,6 @@ _bfd_mips_elf_gc_mark_hook (asection *sec,
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
-/* Update the got entry reference counts for the section being removed.  */
-
-bfd_boolean
-_bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
-                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                            asection *sec ATTRIBUTE_UNUSED,
-                            const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
-{
-#if 0
-  Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **sym_hashes;
-  bfd_signed_vma *local_got_refcounts;
-  const Elf_Internal_Rela *rel, *relend;
-  unsigned long r_symndx;
-  struct elf_link_hash_entry *h;
-
-  if (bfd_link_relocatable (info))
-    return TRUE;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  sym_hashes = elf_sym_hashes (abfd);
-  local_got_refcounts = elf_local_got_refcounts (abfd);
-
-  relend = relocs + sec->reloc_count;
-  for (rel = relocs; rel < relend; rel++)
-    switch (ELF_R_TYPE (abfd, rel->r_info))
-      {
-      case R_MIPS16_GOT16:
-      case R_MIPS16_CALL16:
-      case R_MIPS_GOT16:
-      case R_MIPS_CALL16:
-      case R_MIPS_CALL_HI16:
-      case R_MIPS_CALL_LO16:
-      case R_MIPS_GOT_HI16:
-      case R_MIPS_GOT_LO16:
-      case R_MIPS_GOT_DISP:
-      case R_MIPS_GOT_PAGE:
-      case R_MIPS_GOT_OFST:
-      case R_MICROMIPS_GOT16:
-      case R_MICROMIPS_CALL16:
-      case R_MICROMIPS_CALL_HI16:
-      case R_MICROMIPS_CALL_LO16:
-      case R_MICROMIPS_GOT_HI16:
-      case R_MICROMIPS_GOT_LO16:
-      case R_MICROMIPS_GOT_DISP:
-      case R_MICROMIPS_GOT_PAGE:
-      case R_MICROMIPS_GOT_OFST:
-       /* ??? It would seem that the existing MIPS code does no sort
-          of reference counting or whatnot on its GOT and PLT entries,
-          so it is not possible to garbage collect them at this time.  */
-       break;
-
-      default:
-       break;
-      }
-#endif
-
-  return TRUE;
-}
-
 /* Prevent .MIPS.abiflags from being discarded with --gc-sections.  */
 
 bfd_boolean
@@ -15124,10 +15075,9 @@ mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
     {
       /* xgettext:c-format */
       _bfd_error_handler
-       (_("%B: uses different e_flags (0x%lx) fields than previous modules "
-          "(0x%lx)"),
-        ibfd, (unsigned long) new_flags,
-        (unsigned long) old_flags);
+       (_("%B: uses different e_flags (%#x) fields than previous modules "
+          "(%#x)"),
+        ibfd, new_flags, old_flags);
       ok = FALSE;
     }
 
@@ -15427,7 +15377,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
        _bfd_error_handler
          (_("%B: warning: Unexpected flag in the flags2 field of "
             ".MIPS.abiflags (0x%lx)"), ibfd,
-          (unsigned long) in_abiflags.flags2);
+          in_abiflags.flags2);
     }
   else
     {
This page took 0.029583 seconds and 4 git commands to generate.