PATCH: BZ/175: Fix dynamic string offset
Alan Modra
amodra@bigpond.net.au
Fri May 21 01:35:00 GMT 2004
On Thu, May 20, 2004 at 03:54:41PM -0700, H. J. Lu wrote:
> For
> x = "1111" + (y - 0x1000) * 2;
>
> gcc can generate
>
> addl r14 = @ltoffx(.LC0-8192), r1
> ;;
> ld8.mov r14 = [r14], .LC0-8192
> ;;
>
> _bfd_merged_section_offset thinks offset + adddend is bad when it is
> not the real string position. I looked at _bfd_merged_section_offset.
> It is always passed with addend == 0. I changed addend to dynamic_offset
> so that we can tell _bfd_merged_section_offset to compute offset
> properly. If my patch is right, we may need to make similar change
> to elf32-ppc.c.
I think it quite possible that this patch will break other accesses
into merged sections. To properly fix the problem, you would need to
distinguish this particular access from others. Perhaps the reloc used
might give you enough information.
Consider the case where you have:
a: .string "abc"
b: .string "d"
and someone accesses b using a+4. In that case you want the addend, 4,
to be taken into account in the merge hash table. b can be moved away
from a. My example might be a poor one, but I recall Jakub ran into
something similar when implementing the merge code.
--
Alan Modra
IBM OzLabs - Linux Technology Centre
More information about the Binutils
mailing list