diff options
author | Nick Clifton <nickc@redhat.com> | 2005-03-03 13:50:02 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2005-03-03 13:50:02 +0000 |
commit | aa88ab2be4cb3be83230fbc74cb5257976c84a74 (patch) | |
tree | 80e581086a45b78b310934d72ac11c3fdd3d0bd0 /gas/config/tc-mn10200.c | |
parent | 520b3f4dff36620d4c7c9b34587233b0373960aa (diff) | |
download | binutils-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.c | 29 |
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); |