* elf32-mips.c (_bfd_mips_elf_relocate_section): Handle R_MIPS_26
authorMark Mitchell <mark@codesourcery.com>
Tue, 3 Aug 1999 06:04:21 +0000 (06:04 +0000)
committerMark Mitchell <mark@codesourcery.com>
Tue, 3 Aug 1999 06:04:21 +0000 (06:04 +0000)
and R_MIPS16_26 relocations correctly when relocating.
(_bfd_mips_elf_check_relocs): Don't assume that R_MIPS_CALL_HI16
and R_MIPS_CALL_LO16 are for global symbols.

bfd/ChangeLog
bfd/elf32-mips.c

index 0b574426a9624ed1f5b7a97f8dee316eae93b0f3..6607934379a7dc95aa1b88760beca00c54d54231 100644 (file)
@@ -1,3 +1,10 @@
+1999-08-02  Mark Mitchell  <mark@codesourcery.com>
+
+       * elf32-mips.c (_bfd_mips_elf_relocate_section): Handle R_MIPS_26
+       and R_MIPS16_26 relocations correctly when relocating.
+       (_bfd_mips_elf_check_relocs): Don't assume that R_MIPS_CALL_HI16
+       and R_MIPS_CALL_LO16 are for global symbols.
+       
 1999-08-02  Jakub Jelinek  <jj@ultra.linux.cz>
 
        * elflink.h (elf_bfd_final_link): Copy the whole isym, not just
index 8ac5dcffc1b165e640c36167fccc98d76b650726..b4e718984e8963b6695b2b08207f6fe5ed033418 100644 (file)
@@ -6552,6 +6552,11 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                            | ((addend & 0x7e00000) >> 16)
                            | (addend & 0x1f));
                }
+             else if (r_type == R_MIPS16_26 
+                      || r_type == R_MIPS16_26)
+               /* The addend is stored without its two least
+                  significant bits (which are always zero.)  */
+               addend << 2;
            }
          else
            addend = rel->r_addend;
@@ -6590,6 +6595,11 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
             The subsequent R_MIPS_LO16 will handle the low-order bits.  */
          if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16)
            addend >>= 16;
+         /* 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)
+           addend >>= 2;
 
          if (rela_relocation_p)
            /* If this is a RELA relocation, just update the addend.
@@ -7373,16 +7383,18 @@ _bfd_mips_elf_check_relocs (abfd, info, sec, relocs)
 
        case R_MIPS_CALL_HI16:
        case R_MIPS_CALL_LO16:
-         /* This symbol requires a global offset table entry.  */
-         if (!mips_elf_record_global_got_symbol (h, info, g))
-           return false;
-
-         /* We need a stub, not a plt entry for the undefined
-            function.  But we record it as if it needs plt.  See
-            elf_adjust_dynamic_symbol in elflink.h.  */
-         h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
-         h->type = STT_FUNC;
+         if (h != NULL)
+           {
+             /* This symbol requires a global offset table entry.  */
+             if (!mips_elf_record_global_got_symbol (h, info, g))
+               return false;
 
+             /* We need a stub, not a plt entry for the undefined
+                function.  But we record it as if it needs plt.  See
+                elf_adjust_dynamic_symbol in elflink.h.  */
+             h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
+             h->type = STT_FUNC;
+           }
          break;
 
        case R_MIPS_GOT16: