summaryrefslogtreecommitdiff
path: root/gas/config/tc-mn10200.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2005-03-03 13:50:02 +0000
committerNick Clifton <nickc@redhat.com>2005-03-03 13:50:02 +0000
commitaa88ab2be4cb3be83230fbc74cb5257976c84a74 (patch)
tree80e581086a45b78b310934d72ac11c3fdd3d0bd0 /gas/config/tc-mn10200.c
parent520b3f4dff36620d4c7c9b34587233b0373960aa (diff)
downloadbinutils-redhat-aa88ab2be4cb3be83230fbc74cb5257976c84a74.tar.gz
(tc_gen_reloc): Handle the case where the reloc is the difference of two
symbols defined in the same section.
Diffstat (limited to 'gas/config/tc-mn10200.c')
-rw-r--r--gas/config/tc-mn10200.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/gas/config/tc-mn10200.c b/gas/config/tc-mn10200.c
index 64125511c4..ad7b756f0d 100644
--- a/gas/config/tc-mn10200.c
+++ b/gas/config/tc-mn10200.c
@@ -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);