Check unit->addr_size to read in the proper number of prologue bytes.
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
index 08e1abbcd70455092935b715855031766ac8afba..f47073448a5b73a0d6928e118c07f0a9385a5f22 100644 (file)
@@ -610,9 +610,8 @@ _bfd_mips_elf_read_ecoff_info (abfd, section, debug)
   if (ext_hdr == NULL && swap->external_hdr_size != 0)
     goto error_return;
 
-  if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
-                               swap->external_hdr_size)
-      == false)
+  if (! bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
+                                 swap->external_hdr_size))
     goto error_return;
 
   symhdr = &debug->symbolic_header;
@@ -5013,8 +5012,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
             space.  Thus, when they use an R_MIPS_64 they mean what is
             usually meant by R_MIPS_32, with the exception that the
             stored value is sign-extended to 64 bits.  */
-         howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32,
-                                          NEWABI_P (input_bfd));
+         howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, false);
 
          /* On big-endian systems, we need to lie about the position
             of the reloc.  */
@@ -5049,6 +5047,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              addend = mips_elf_obtain_contents (howto, rel, input_bfd,
                                                 contents);
              addend &= howto->src_mask;
+             addend <<= howto->rightshift;
 
              /* For some kinds of relocations, the ADDEND is a
                 combination of the addend stored in two different
@@ -5081,11 +5080,11 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                    return false;
 
                  /* Obtain the addend kept there.  */
-                 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, lo,
-                                                       rela_relocation_p);
+                 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, lo, false);
                  l = mips_elf_obtain_contents (lo16_howto, lo16_relocation,
                                                input_bfd, contents);
                  l &= lo16_howto->src_mask;
+                 l <<= lo16_howto->rightshift;
                  l = mips_elf_sign_extend (l, 16);
 
                  addend <<= 16;
@@ -5144,13 +5143,6 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              || r_type == R_MIPS_LITERAL)
            addend -= (_bfd_get_gp_value (output_bfd)
                       - _bfd_get_gp_value (input_bfd));
-         else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
-                  || r_type == R_MIPS_GNU_REL16_S2)
-           /* The addend is stored without its two least
-              significant bits (which are always zero.)  In a
-              non-relocateable link, calculate_relocation will do
-              this shift; here, we must do it ourselves.  */
-           addend <<= 2;
 
          r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
          sym = local_syms + r_symndx;
@@ -5158,23 +5150,20 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
            /* Adjust the addend appropriately.  */
            addend += local_sections[r_symndx]->output_offset;
 
-         /* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16,
-            then we only want to write out the high-order 16 bits.
-            The subsequent R_MIPS_LO16 will handle the low-order bits.  */
-         if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16
-             || r_type == R_MIPS_GNU_REL_HI16)
-           addend = mips_elf_high (addend);
-         else if (r_type == R_MIPS_HIGHER)
-           addend = mips_elf_higher (addend);
-         else if (r_type == R_MIPS_HIGHEST)
-           addend = mips_elf_highest (addend);
-
-         /* If the relocation is for an R_MIPS_26 relocation, then
-            the two low-order bits are not stored in the object file;
-            they are implicitly zero.  */
-         else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
-                  || r_type == R_MIPS_GNU_REL16_S2)
-           addend >>= 2;
+         if (howto->partial_inplace)
+           {
+             /* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16,
+                then we only want to write out the high-order 16 bits.
+                The subsequent R_MIPS_LO16 will handle the low-order bits.
+              */
+             if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16
+                 || r_type == R_MIPS_GNU_REL_HI16)
+               addend = mips_elf_high (addend);
+             else if (r_type == R_MIPS_HIGHER)
+               addend = mips_elf_higher (addend);
+             else if (r_type == R_MIPS_HIGHEST)
+               addend = mips_elf_highest (addend);
+           }
 
          if (rela_relocation_p)
            /* If this is a RELA relocation, just update the addend.
@@ -5187,9 +5176,10 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                 destination mask because the place to which we are
                 writing will be source of the addend in the final
                 link.  */
+             addend >>= howto->rightshift;
              addend &= howto->src_mask;
 
-             if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd))
+             if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
                /* See the comment above about using R_MIPS_64 in the 32-bit
                   ABI.  Here, we need to update the addend.  It would be
                   possible to get away with just using the R_MIPS_32 reloc
@@ -5250,6 +5240,8 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
       else
        use_saved_addend_p = false;
 
+      addend >>= howto->rightshift;
+
       /* Figure out what value we are supposed to relocate.  */
       switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
                                             input_section, info, rel,
@@ -6422,6 +6414,15 @@ _bfd_mips_elf_hide_symbol (info, entry, force_local)
   got->_raw_size += MIPS_ELF_GOT_SIZE (dynobj);
 }
 \f
+boolean
+_bfd_mips_elf_ignore_discarded_relocs (sec)
+     asection *sec;
+{
+  if (strcmp (sec->name, ".pdr") == 0)
+    return true;
+  return false;
+}
+\f
 /* MIPS ELF uses a special find_nearest_line routine in order the
    handle the ECOFF debugging information.  */
 
@@ -7545,7 +7546,7 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
   asection *sec;
 
   /* Check if we have the same endianess */
-  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
     return false;
 
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
This page took 0.026018 seconds and 4 git commands to generate.