* elf32-mips.c (mips_elf_calculate_relocation): Do not complain
authorMark Mitchell <mark@codesourcery.com>
Tue, 13 Jul 1999 15:23:22 +0000 (15:23 +0000)
committerMark Mitchell <mark@codesourcery.com>
Tue, 13 Jul 1999 15:23:22 +0000 (15:23 +0000)
when _gp_disp is undefined.  Do not check R_MIPS_LO16 for overflow
when the relocation is against _gp_disp.

bfd/ChangeLog
bfd/elf32-mips.c

index c274a440df1ab26c52fdcf52e23e5933b7f2e6ec..78787ada18cc2d4f5fc4d13e6d1ee57cf8e204d0 100644 (file)
@@ -1,3 +1,9 @@
+1999-07-13  Mark Mitchell  <mark@codesourcery.com>
+
+       * elf32-mips.c (mips_elf_calculate_relocation): Do not complain
+       when _gp_disp is undefined.  Do not check R_MIPS_LO16 for overflow
+       when the relocation is against _gp_disp.
+
 1999-07-12  Mark Mitchell  <mark@codesourcery.com>
 
        * dwarf2.c (read_attribute): Support DW_FORM_ref8.
index 9d7a07404e9d98d4888978c706815b2faf759fe8..03d7f3fcb1e89a91ca3361821e404ab7ec96b9f4 100644 (file)
@@ -5770,11 +5770,13 @@ mips_elf_calculate_relocation (abfd,
 
          gp_disp_p = true;
        }
-
-      /* If this symbol is defined, calculate its address.  */
-      if ((h->root.root.type == bfd_link_hash_defined
-          || h->root.root.type == bfd_link_hash_defweak)
-         && h->root.root.u.def.section)
+      /* If this symbol is defined, calculate its address.  Note that
+        _gp_disp is a magic symbol, always implicitly defined by the
+        linker, so it's inappropriate to check to see whether or not
+        its defined.  */
+      else if ((h->root.root.type == bfd_link_hash_defined
+               || h->root.root.type == bfd_link_hash_defweak)
+              && h->root.root.u.def.section)
        {
          sec = h->root.root.u.def.section;
          if (sec->output_section)
@@ -5908,7 +5910,22 @@ mips_elf_calculate_relocation (abfd,
       else
        {
          value = addend + gp - p + 4;
-         overflowed_p = mips_elf_overflow_p (value, 16);
+         /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
+            for overflow.  But, on, say, Irix 5, relocations against
+            _gp_disp are normally generated from the .cpload
+            pseudo-op.  It generates code that normally looks like
+            this:
+
+              lui    $gp,%hi(_gp_disp)
+              addiu  $gp,$gp,%lo(_gp_disp)
+              addu   $gp,$gp,$t9
+
+            Here $t9 holds the address of the function being called,
+            as required by the MIPS ELF ABI.  The R_MIPS_LO16
+            relocation can easily overlfow in this situation, but the
+            R_MIPS_HI16 relocation will handle the overflow.
+            Therefore, we consider this a bug in the MIPS ABI, and do
+            not check for overflow here.  */
        }
       break;