* elf32-mips.c (elf_mips_howto_table): Fix src_mask for
authorMark Mitchell <mark@codesourcery.com>
Mon, 9 Aug 1999 22:45:39 +0000 (22:45 +0000)
committerMark Mitchell <mark@codesourcery.com>
Mon, 9 Aug 1999 22:45:39 +0000 (22:45 +0000)
R_MIPS_GOT16 and R_MIPS_CALL16.
(mips_elf_got16_entry): Use mips_elf_high to calculate the value
to use wheen looking for a preexisting GOT entry.

bfd/ChangeLog
bfd/elf32-mips.c

index 349d9831e08ee7f38e85e186fc4130697c631c53..9be218b8577151ca8e45406e8fddaf51a8dc317e 100644 (file)
@@ -1,3 +1,10 @@
+1999-08-09  Mark Mitchell  <mark@codesourcery.com>
+
+       * elf32-mips.c (elf_mips_howto_table): Fix src_mask for
+       R_MIPS_GOT16 and R_MIPS_CALL16.
+       (mips_elf_got16_entry): Use mips_elf_high to calculate the value
+       to use wheen looking for a preexisting GOT entry.
+
 1999-08-09  Jakub Jelinek  <jj@ultra.linux.cz>
 
        * elf64-sparc.c (sparc64_elf_relocate_section): Back out part of
index f0b8bec2cb14bb14cf94bc1097b5ee7fb93b89f7..27e1c5ee87c0279376aa4938534c6ba239d52b07 100644 (file)
@@ -602,7 +602,7 @@ static reloc_howto_type elf_mips_howto_table[] =
         _bfd_mips_elf_got16_reloc,     /* special_function */
         "R_MIPS_GOT16",        /* name */
         false,                 /* partial_inplace */
-        0,                     /* src_mask */
+        0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -632,7 +632,7 @@ static reloc_howto_type elf_mips_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_MIPS_CALL16",       /* name */
         false,                 /* partial_inplace */
-        0,                     /* src_mask */
+        0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -5537,7 +5537,11 @@ mips_elf_got16_entry (abfd, info, value)
   bfd_vma index;
   bfd_vma address;
 
-  value &= 0xffff0000;
+  /* Although the ABI says that it is "the high-order 16 bits" that we
+     want, it is really the %high value.  The complete value is
+     calculated with a `addiu' of a LO16 relocation, just as with a
+     HI16/LO16 pair.  */
+  value = mips_elf_high (value);
   g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
 
   /* Look to see if we already have an appropriate entry.  */