PR gas/977
authorDave Korn <dave.korn@artimi.com>
Mon, 8 Jun 2009 16:06:24 +0000 (16:06 +0000)
committerDave Korn <dave.korn@artimi.com>
Mon, 8 Jun 2009 16:06:24 +0000 (16:06 +0000)
* config/tc-i386.c (md_estimate_size_before_relax):  Don't relax
branches to weak symbols.
(md_apply_fix):  Don't convert fixes against weak symbols to
section-relative offsets, but save addend for later reloc emission.
(tc_gen_reloc):  When emitting reloc against weak symbol, adjust
addend to pre-compensate for bfd_install_relocation.

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

index 0678a3bdf06dc3f0f81611f337cc95f8143e5ffe..23ba55bcb4b17e0c24b549ffd8604ea36f9382fd 100644 (file)
@@ -1,3 +1,13 @@
+2009-06-08  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       PR gas/977
+       * config/tc-i386.c (md_estimate_size_before_relax):  Don't relax
+       branches to weak symbols.
+       (md_apply_fix):  Don't convert fixes against weak symbols to
+       section-relative offsets, but save addend for later reloc emission.
+       (tc_gen_reloc):  When emitting reloc against weak symbol, adjust
+       addend to pre-compensate for bfd_install_relocation.
+
 2009-06-04  Alan Modra  <amodra@bigpond.net.au>
 
        * dep-in.sed: Don't use \n in replacement part of s command.
index 706e924d98cac0335862678fa6029b15e49032c2..faa638fbbf185a87a32f3d7dca79aca6cb38c51d 100644 (file)
@@ -6955,6 +6955,10 @@ md_estimate_size_before_relax (fragP, segment)
       || (IS_ELF
          && (S_IS_EXTERNAL (fragP->fr_symbol)
              || S_IS_WEAK (fragP->fr_symbol)))
+#endif
+#if defined (OBJ_COFF) && defined (TE_PE)
+      || (OUTPUT_FLAVOR == bfd_target_coff_flavour 
+         && S_IS_WEAK (fragP->fr_symbol))
 #endif
       )
     {
@@ -7249,6 +7253,12 @@ md_apply_fix (fixP, valP, seg)
        value += md_pcrel_from (fixP);
 #endif
     }
+#if defined (OBJ_COFF) && defined (TE_PE)
+  if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
+    {
+      value -= S_GET_VALUE (fixP->fx_addsy);
+    }
+#endif
 
   /* Fix a few things - the dynamic linker expects certain values here,
      and we must not disappoint it.  */
@@ -7312,6 +7322,16 @@ md_apply_fix (fixP, valP, seg)
   /* Are we finished with this relocation now?  */
   if (fixP->fx_addsy == NULL)
     fixP->fx_done = 1;
+#if defined (OBJ_COFF) && defined (TE_PE)
+  else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
+    {
+      fixP->fx_done = 0;
+      /* Remember value for tc_gen_reloc.  */
+      fixP->fx_addnumber = value;
+      /* Clear out the frag for now.  */
+      value = 0;
+    }
+#endif
   else if (use_rela_relocations)
     {
       fixP->fx_no_overflow = 1;
@@ -8214,7 +8234,11 @@ tc_gen_reloc (section, fixp)
         vtable entry to be used in the relocation's section offset.  */
       if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
        rel->address = fixp->fx_offset;
-
+#if defined (OBJ_COFF) && defined (TE_PE)
+      else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
+       rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
+      else
+#endif
       rel->addend = 0;
     }
   /* Use the rela in 64bit mode.  */