Extend the fix already created for PR 16858 so that it works with x86 PE targets...
authorNick Clifton <nickc@redhat.com>
Mon, 19 May 2014 13:29:31 +0000 (14:29 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 19 May 2014 13:29:31 +0000 (14:29 +0100)
PR gas/16858
* config/tc-i386.c (md_apply_fix): Improve the detection of code
symbols for 32-bit PE targets.

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

index 22435700091255bb8900bdaf863b5e8adf581e8b..26cef7ff9ddd5e1fe74d59a735136956de684065 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-19  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/16858
+       * config/tc-i386.c (md_apply_fix): Improve the detection of code
+       symbols for 32-bit PE targets.
+
 2014-05-18  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/tc-mips.c (md_obj_begin): Delete.
index 707ce59bc5758dbb5e9b5e772be6639923097ee8..341d10068e9c784e67e5221428ded255d9b7cac5 100644 (file)
@@ -9151,6 +9151,16 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
       /* PR 16858: Do not modify weak function references.  */
       && ! fixP->fx_pcrel)
     {
+#if !defined (TE_PEP)
+      /* For x86 PE weak function symbols are neither PC-relative
+        nor do they set S_IS_FUNCTION.  So the only reliable way
+        to detect them is to check the flags of their containing
+        section.  */
+      if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
+         && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
+       ;
+      else
+#endif
       value -= S_GET_VALUE (fixP->fx_addsy);
     }
 #endif