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; + + 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; + } } - 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); + free (reloc->sym_ptr_ptr); + free (reloc); + return NULL; } else {