* elf32-mips.c (mips_elf_next_lo16_addend): Rename to ...
authorMark Mitchell <mark@codesourcery.com>
Wed, 4 Aug 1999 03:52:59 +0000 (03:52 +0000)
committerMark Mitchell <mark@codesourcery.com>
Wed, 4 Aug 1999 03:52:59 +0000 (03:52 +0000)
(mips_elf_next_lo16_relocation): Don't compute the addend here.
Just return the relocation found.
(mips_elf_relocate_section): Pull the LO16 addend out of the
section itself when using REL relocations.

bfd/ChangeLog
bfd/elf32-mips.c

index 980c633d324ea4842e9b7e103d58486fecfd8877..7542c610a67188f295791396f614d41279a10f9c 100644 (file)
@@ -1,5 +1,11 @@
 1999-08-03  Mark Mitchell  <mark@codesourcery.com>
 
+       * elf32-mips.c (mips_elf_next_lo16_addend): Rename to ...
+       (mips_elf_next_lo16_relocation): Don't compute the addend here.
+       Just return the relocation found.
+       (mips_elf_relocate_section): Pull the LO16 addend out of the
+       section itself when using REL relocations.
+       
        * elf32-mips.c (mips_elf_calculate_relocation): Restore
        _DYNAMIC_LINK handling and handling of undefined symbols in shared
        libraries.
index dd2c55ce0b0a02784ce2ea8588ac97464953a21e..9d963cca2b42deb0afb9d726a3ae9f3c83c79858 100644 (file)
@@ -165,8 +165,8 @@ static boolean mips_elf_record_global_got_symbol
           struct mips_got_info *));
 static bfd_vma mips_elf_got_page
   PARAMS ((bfd *, struct bfd_link_info *, bfd_vma, bfd_vma *));
-static boolean mips_elf_next_lo16_addend
-  PARAMS ((const Elf_Internal_Rela *, const Elf_Internal_Rela *, bfd_vma *));
+static const Elf_Internal_Rela *mips_elf_next_lo16_relocation
+  PARAMS ((const Elf_Internal_Rela *, const Elf_Internal_Rela *));
 static bfd_reloc_status_type mips_elf_calculate_relocation
   PARAMS ((bfd *, bfd *, asection *, struct bfd_link_info *,
           const Elf_Internal_Rela *, bfd_vma, reloc_howto_type *,
@@ -5563,15 +5563,13 @@ mips_elf_got16_entry (abfd, info, value)
   return index;
 }
 
-/* Sets *ADDENDP to the addend for the first R_MIPS_LO16 relocation
-   found, beginning with RELOCATION.  RELEND is one-past-the-end of
-   the relocation table.  */
+/* Returns the first R_MIPS_LO16 relocation found, beginning with
+   RELOCATION.  RELEND is one-past-the-end of the relocation table.  */
 
-static boolean
-mips_elf_next_lo16_addend (relocation, relend, addendp)
+static const Elf_Internal_Rela *
+mips_elf_next_lo16_relocation (relocation, relend)
      const Elf_Internal_Rela *relocation;
      const Elf_Internal_Rela *relend;
-     bfd_vma *addendp;
 {
   /* According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must be
      immediately following.  However, for the IRIX6 ABI, the next
@@ -5582,17 +5580,14 @@ mips_elf_next_lo16_addend (relocation, relend, addendp)
   while (relocation < relend)
     {
       if (ELF32_R_TYPE (relocation->r_info) == R_MIPS_LO16)
-       {
-         *addendp = relocation->r_addend;
-         return true;
-       }
+       return relocation;
 
       ++relocation;
     }
 
   /* We didn't find it.  */
   bfd_set_error (bfd_error_bad_value);
-  return false;
+  return NULL;
 }
 
 /* Create a rel.dyn relocation for the dynamic linker to resolve.  The
@@ -6529,13 +6524,24 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                      && mips_elf_local_relocation_p (input_bfd, rel,
                                                      local_sections)))
                {
+                 bfd_vma l;
+                 const Elf_Internal_Rela *lo16_relocation;
+                 reloc_howto_type *lo16_howto;
+
                  /* Scan ahead to find a matching R_MIPS_LO16
                     relocation.  */
-                 bfd_vma l;
-                 
-                 if (!mips_elf_next_lo16_addend (rel, relend, &l))
+                 lo16_relocation 
+                   = mips_elf_next_lo16_relocation (rel, relend); 
+                 if (lo16_relocation == NULL)
                    return false;
 
+                 /* Obtain the addend kept there.  */
+                 lo16_howto = mips_rtype_to_howto (R_MIPS_LO16);
+                 l = mips_elf_obtain_contents (lo16_howto,
+                                               lo16_relocation,
+                                               input_bfd, contents);
+                 l &= lo16_howto->src_mask;
+
                  /* Save the high-order bit for later.  When we
                     encounter the R_MIPS_LO16 relocation we will need
                     them again.  */
@@ -6607,7 +6613,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
             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)
-           addend >>= 16;
+           addend = mips_elf_high (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.  */