* config/tc-mips.c (md_apply_fix): If we aren't adjusting this
authorIan Lance Taylor <ian@airs.com>
Mon, 3 Feb 1997 17:56:00 +0000 (17:56 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 3 Feb 1997 17:56:00 +0000 (17:56 +0000)
fixup to be against the section symbol, adjust the value
accordingly.

gas/ChangeLog
gas/config/tc-mips.c

index 51d9df0aef7df83c54659b8c47d43e4d3b314e43..a861a8f919cce5cafb9d79dddc4f6825837a0b70 100644 (file)
@@ -1,5 +1,9 @@
 Mon Feb  3 12:35:54 1997  Ian Lance Taylor  <ian@cygnus.com>
 
+       * config/tc-mips.c (md_apply_fix): If we aren't adjusting this
+       fixup to be against the section symbol, adjust the value
+       accordingly.
+
        * symbols.c (resolve_symbol_value): Don't change X_add_number for
        an equated symbol.
        * write.c (write_relocs): Avoid looping on equated symbols.
index 4a59ab9a1e22941e3998b815f5bbcac7f10d6856..52f8c0ba46181bda5063912f9220ad753e6698ec 100644 (file)
@@ -8217,6 +8217,27 @@ md_apply_fix (fixP, valueP)
          || fixP->fx_r_type == BFD_RELOC_64);
 
   value = *valueP;
+
+  /* If we aren't adjusting this fixup to be against the section
+     symbol, we need to adjust the value.  */
+#ifdef S_GET_OTHER
+  if (fixP->fx_addsy != NULL
+      && (S_IS_EXTERNAL (fixP->fx_addsy)
+         || S_IS_WEAK (fixP->fx_addsy))
+      && OUTPUT_FLAVOR == bfd_target_elf_flavour
+      && S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
+    {
+      value -= S_GET_VALUE (fixP->fx_addsy);
+      if (value != 0 && ! fixP->fx_pcrel)
+       {
+         /* In this case, the bfd_install_relocation routine will
+             incorrectly add the symbol value back in.  We just want
+             the addend to appear in the object file.  */
+         value -= S_GET_VALUE (fixP->fx_addsy);
+       }
+    }
+#endif
+
   fixP->fx_addnumber = value;  /* Remember value for tc_gen_reloc */
 
   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel)