(tc_gen_reloc): Handle the case where the reloc is the difference of two
authorNick Clifton <nickc@redhat.com>
Thu, 3 Mar 2005 13:50:02 +0000 (13:50 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 3 Mar 2005 13:50:02 +0000 (13:50 +0000)
symbols defined in the same section.

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

index b1592b22e9014b1b1683aa6377c299e892ef4505..9bcfa109e4bb0877b197aebc5127f97105ed9b2d 100644 (file)
@@ -1,5 +1,9 @@
 2005-03-03  Nick Clifton  <nickc@redhat.com>
 
+       * config/tc-mn10200.c (tc_gen_reloc): Handle the case where the
+       reloc is the difference of two symbols defined in the same
+       section.
+
        * config/tc-iq2000.c (line_comment_chars): Include the # character
        as otherwise this breaks #APP/#NO_APP processing.
 
index 64125511c4e77e2cfaabffe990038828b94f95ab..ad7b756f0d9cb1623d12353679208a618ae8b8ff 100644 (file)
@@ -1235,17 +1235,24 @@ tc_gen_reloc (seg, fixp)
 
   if (fixp->fx_subsy != NULL)
     {
-      /* FIXME: We should resolve difference expressions if possible
-        here.  At least this is better than silently ignoring the
-        subtrahend.  */
-      as_bad_where (fixp->fx_file, fixp->fx_line,
-                   _("can't resolve `%s' {%s section} - `%s' {%s section}"),
-                   fixp->fx_addsy ? S_GET_NAME (fixp->fx_addsy) : "0",
-                   segment_name (fixp->fx_addsy
-                                 ? S_GET_SEGMENT (fixp->fx_addsy)
-                                 : absolute_section),
-                   S_GET_NAME (fixp->fx_subsy),
-                   segment_name (S_GET_SEGMENT (fixp->fx_addsy)));
+      if (S_GET_SEGMENT (fixp->fx_addsy) == S_GET_SEGMENT (fixp->fx_subsy)
+         && S_IS_DEFINED (fixp->fx_subsy))
+       {
+         fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy);
+         fixp->fx_subsy = NULL;
+       }
+      else
+       /* FIXME: We should try more ways to resolve difference expressions
+          here.  At least this is better than silently ignoring the
+          subtrahend.  */
+       as_bad_where (fixp->fx_file, fixp->fx_line,
+                     _("can't resolve `%s' {%s section} - `%s' {%s section}"),
+                     fixp->fx_addsy ? S_GET_NAME (fixp->fx_addsy) : "0",
+                     segment_name (fixp->fx_addsy
+                                   ? S_GET_SEGMENT (fixp->fx_addsy)
+                                   : absolute_section),
+                     S_GET_NAME (fixp->fx_subsy),
+                     segment_name (S_GET_SEGMENT (fixp->fx_addsy)));
     }
 
   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);