From: Alexandre Oliva Date: Tue, 25 Sep 2001 08:51:52 +0000 (+0000) Subject: * config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS* X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6e22e505ed8f0562dfd75b53f845091df952ba9e;p=binutils-gdb.git * config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS* relocation for differences between symbols in a section other than the one in which the difference is to be placed; apply the relocation instead. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 31f61c4ac5f..eb9f1f8bedb 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2001-09-25 Alexandre Oliva + + * config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS* + relocation for differences between symbols in a section other + than the one in which the difference is to be placed; apply + the relocation instead. + 2001-09-24 Nick Clifton * config/tc-arc.c: Add missing prototype. diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c index 678224079a8..a2acc753599 100644 --- a/gas/config/tc-mn10300.c +++ b/gas/config/tc-mn10300.c @@ -1824,12 +1824,41 @@ tc_gen_reloc (seg, fixp) { as_bad_where (fixp->fx_file, fixp->fx_line, "Difference of symbols in different sections is not supported"); - return NULL; } + else + { + char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal; + + reloc->addend = (S_GET_VALUE (fixp->fx_addsy) + - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); + + switch (fixp->fx_r_type) + { + case BFD_RELOC_8: + md_number_to_chars (fixpos, reloc->addend, 1); + break; + + case BFD_RELOC_16: + md_number_to_chars (fixpos, reloc->addend, 2); + break; - reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol; - reloc->addend = (S_GET_VALUE (fixp->fx_addsy) - - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); + case BFD_RELOC_24: + md_number_to_chars (fixpos, reloc->addend, 3); + break; + + case BFD_RELOC_32: + md_number_to_chars (fixpos, reloc->addend, 4); + break; + + default: + reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol; + return reloc; + } + } + + free (reloc->sym_ptr_ptr); + free (reloc); + return NULL; } else {