* config/tc-i386.c (md_apply_fix3): Add horrible adjustments to
authorIan Lance Taylor <ian@airs.com>
Sun, 12 Sep 1999 05:06:09 +0000 (05:06 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 12 Sep 1999 05:06:09 +0000 (05:06 +0000)
the value if TE_PE and a global defined symbol.

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

index 8e114e1dab2cd78841a8594e0a19ce63153be5fb..565944d0f6398e6ae0db45f808914d02542541c7 100644 (file)
@@ -1,3 +1,8 @@
+1999-09-12  Ian Lance Taylor  <ian@zembu.com>
+
+       * config/tc-i386.c (md_apply_fix3): Add horrible adjustments to
+       the value if TE_PE and a global defined symbol.
+
 1999-09-11  Ian Lance Taylor  <ian@zembu.com>
 
        * write.c (dump_section_relocs): Call print_symbol_value_1 to
index 0a6b1de651e51d53545c38d122e30aab892a85d7..8e3cae700842bd6fde80251415e9e21af8905780 100644 (file)
@@ -938,8 +938,8 @@ reloc (size, pcrel, other)
  * some cases we force the original symbol to be used.
  */
 int
-tc_i386_fix_adjustable(fixP)
-     fixS * fixP;
+tc_i386_fix_adjustable (fixP)
+     fixS *fixP;
 {
 #if defined (OBJ_ELF) || defined (TE_PE)
   /* Prevent all adjustments to global symbols, or else dynamic
@@ -3908,8 +3908,34 @@ md_apply_fix3 (fixP, valp, seg)
         address offset for a PC relative symbol.  */
       if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
        value += md_pcrel_from (fixP);
+      else if (S_IS_EXTERNAL (fixP->fx_addsy)
+              || S_IS_WEAK (fixP->fx_addsy))
+       {
+         /* We are generating an external relocation for this defined
+             symbol.  We add the address, because
+             bfd_install_relocation will subtract it.  VALUE already
+             holds the symbol value, because fixup_segment added it
+             in.  We subtract it out, and then we subtract it out
+             again because bfd_install_relocation will add it in
+             again.  */
+         value += md_pcrel_from (fixP);
+         value -= 2 * S_GET_VALUE (fixP->fx_addsy);
+       }
 #endif
     }
+#ifdef TE_PE
+  else if (fixP->fx_addsy != NULL
+          && S_IS_DEFINED (fixP->fx_addsy)
+          && (S_IS_EXTERNAL (fixP->fx_addsy)
+              || S_IS_WEAK (fixP->fx_addsy)))
+    {
+      /* We are generating an external relocation for this defined
+         symbol.  VALUE already holds the symbol value, and
+         bfd_install_relocation will add it in again.  We don't want
+         either addition.  */
+      value -= 2 * S_GET_VALUE (fixP->fx_addsy);
+    }
+#endif
 
   /* Fix a few things - the dynamic linker expects certain values here,
      and we must not dissappoint it. */