diff options
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 6412551..ad7b756 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); |