From 77ccfee5d29b979b4edf12310a112167f8986df7 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 3 Mar 2005 13:50:02 +0000 Subject: [PATCH] (tc_gen_reloc): Handle the case where the reloc is the difference of two symbols defined in the same section. --- gas/ChangeLog | 4 ++++ gas/config/tc-mn10200.c | 29 ++++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index b1592b22e90..9bcfa109e4b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,9 @@ 2005-03-03 Nick Clifton + * 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. diff --git a/gas/config/tc-mn10200.c b/gas/config/tc-mn10200.c index 64125511c4e..ad7b756f0d9 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); -- 2.30.2