* elf32-sh.c (sh_elf_relax_section): Allow for branches across
non-moving .align directives. Preserve any DIR32 offset when converting bsr's to jsr's.
This commit is contained in:
parent
e14e52f868
commit
f725025bcb
|
@ -1,3 +1,9 @@
|
||||||
|
2006-08-08 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
|
* elf32-sh.c (sh_elf_relax_section): Allow for branches across
|
||||||
|
non-moving .align directives. Preserve any DIR32 offset when
|
||||||
|
converting bsr's to jsr's.
|
||||||
|
|
||||||
2006-08-08 Alan Modra <amodra@bigpond.net.au>
|
2006-08-08 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf64-ppc.c (ppc64_elf_build_stubs): Clear relbrlt reloc_count
|
* elf64-ppc.c (ppc64_elf_build_stubs): Clear relbrlt reloc_count
|
||||||
|
|
|
@ -614,7 +614,11 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
|
||||||
+ sec->output_section->vma
|
+ sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ 4));
|
+ 4));
|
||||||
if (foff < -0x1000 || foff >= 0x1000)
|
/* A branch to an address beyond ours might be increased by an
|
||||||
|
.align that doesn't move when bytes behind us are deleted.
|
||||||
|
So, we add some slop in this calculation to allow for
|
||||||
|
that. */
|
||||||
|
if (foff < -0x1000 || foff >= 0x1000 - 8)
|
||||||
{
|
{
|
||||||
/* After all that work, we can't shorten this function call. */
|
/* After all that work, we can't shorten this function call. */
|
||||||
continue;
|
continue;
|
||||||
|
@ -652,6 +656,12 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
|
||||||
|
|
||||||
irel->r_addend = -4;
|
irel->r_addend = -4;
|
||||||
|
|
||||||
|
/* When we calculated the symbol "value" we had an offset in the
|
||||||
|
DIR32's word in memory (we read and add it above). However,
|
||||||
|
the jsr we create does NOT have this offset encoded, so we
|
||||||
|
have to add it to the addend to preserve it. */
|
||||||
|
irel->r_addend += bfd_get_32 (abfd, contents + paddr);
|
||||||
|
|
||||||
/* See if there is another R_SH_USES reloc referring to the same
|
/* See if there is another R_SH_USES reloc referring to the same
|
||||||
register load. */
|
register load. */
|
||||||
for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
|
for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
|
||||||
|
|
Loading…
Reference in New Issue