[AVR][PATCH] Add linker relaxation support / Fix 64 bit bug in gas rev. 5
Nick Clifton
nickc@redhat.com
Thu Nov 10 12:50:00 GMT 2005
Hi Björn,
> The simple test case
>
> .data
> here:
> .set sym, here
> .long sym
>
> Output of objdump:
>
> /tmp/test.o: file format elf32-avr
>
> RELOCATION RECORDS FOR [.data]:
> OFFSET TYPE VALUE
> 00000000 R_AVR_32 sym
Are you using version of GAS with your relaxation patch applied ?
Without it (but with linkrelax set to 1 in md_begin) I get this:
RELOCATION RECORDS FOR [.data]:
OFFSET TYPE VALUE
00000000 R_AVR_32 .data
Ie the reloc has been transformed into a reloc against the .data section
symbol.
Note - the .set pseudo-op does not create an alias, it creates an
equivalence, so in your test case it creates a new symbol called "sym"
whose value is the same as that of the symbol called "here". So for
example with your test case if I run "objdump -t test.o" I see:
SYMBOL TABLE:
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l .data 00000000 here
00000000 l .data 00000000 sym
ie both "sym" and "here" exist as local symbols.
> Is it possible that in tc_gen_reloc after
>
> *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
>
> one would need some kind of recursion for the case where the value of the
> symbol sym itself is taken from another symbol?
That should not be necessary. What should have happened is that before
tc_gen_reloc() is called any relocs against local symbols should have
been either resolved or else transformed into relocs against global
symbols (usually section symbols). See adjust_reloc_syms() in
gas/write.c. I am guessing that in your case tc_fix_adjustable() is
defined and not allowing the local symbol reference to be transformed
into a section symbol reference.
Cheers
Nick
More information about the Binutils
mailing list