From 50248c890f1bc82c6e1751bd549da7580c60f098 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 6 Jul 2010 09:29:47 +0000 Subject: [PATCH] bfd/ * elf32-ppc.c (ppc_elf_relax_section): Insert branch around trampolines only for .init and .fini sections. ld/testsuite/ * ld-powerpc/relax.s: Add branch back to _start. * ld-powerpc/relax.d: Update. * ld-powerpc/relaxr.d: Update. --- bfd/ChangeLog | 5 +++++ bfd/elf32-ppc.c | 18 ++++++++++++------ ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-powerpc/relax.d | 2 +- ld/testsuite/ld-powerpc/relax.s | 1 + ld/testsuite/ld-powerpc/relaxr.d | 3 ++- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6c4dbf50288..ade05112eec 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2010-07-06 Alan Modra + + * elf32-ppc.c (ppc_elf_relax_section): Insert branch around + trampolines only for .init and .fini sections. + 2010-07-05 Alan Modra * elf32-ppc.c: Formatting. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 60adae8a127..e3638cd20c6 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5967,6 +5967,7 @@ ppc_elf_relax_section (bfd *abfd, struct ppc_elf_link_hash_table *htab; bfd_size_type trampoff; asection *got2; + bfd_boolean maybe_pasted; *again = FALSE; @@ -5985,8 +5986,11 @@ ppc_elf_relax_section (bfd *abfd, return TRUE; trampoff = (isec->size + 3) & (bfd_vma) -4; + maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0 + || strcmp (isec->output_section->name, ".fini") == 0); /* Space for a branch around any trampolines. */ - trampoff += 4; + if (maybe_pasted) + trampoff += 4; symtab_hdr = &elf_symtab_hdr (abfd); @@ -6311,7 +6315,6 @@ ppc_elf_relax_section (bfd *abfd, { const int *stub; bfd_byte *dest; - bfd_vma val; int i, size; do @@ -6327,12 +6330,15 @@ ppc_elf_relax_section (bfd *abfd, goto error_return; isec->size = (isec->size + 3) & (bfd_vma) -4; - /* Branch around the trampolines. */ - val = B + trampoff - isec->size; dest = contents + isec->size; + /* Branch around the trampolines. */ + if (maybe_pasted) + { + bfd_vma val = B + trampoff - isec->size; + bfd_put_32 (abfd, val, dest); + dest += 4; + } isec->size = trampoff; - bfd_put_32 (abfd, val, dest); - dest += 4; if (link_info->shared) { diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index fdd6a501e85..463a14c5fe2 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-07-06 Alan Modra + + * ld-powerpc/relax.s: Add branch back to _start. + * ld-powerpc/relax.d: Update. + * ld-powerpc/relaxr.d: Update. + 2010-07-01 Alan Modra * lib/ld-lib.exp (default_ld_simple_link): Add $gcc_ld_flag before diff --git a/ld/testsuite/ld-powerpc/relax.d b/ld/testsuite/ld-powerpc/relax.d index 51d253be33b..5a6b3ddf5ff 100644 --- a/ld/testsuite/ld-powerpc/relax.d +++ b/ld/testsuite/ld-powerpc/relax.d @@ -8,7 +8,7 @@ Disassembly of section .text: 4: 48 00 00 11 bl 14 <_start\+0x14> 8: 48 00 43 19 bl 4320 c: 48 00 00 09 bl 14 <_start\+0x14> - 10: 48 00 00 14 b 24 <.*> + 10: 4b ff ff f0 b 0 <.*> 14: 3d 80 80 00 lis r12,-32768 18: 39 8c 12 34 addi r12,r12,4660 1c: 7d 89 03 a6 mtctr r12 diff --git a/ld/testsuite/ld-powerpc/relax.s b/ld/testsuite/ld-powerpc/relax.s index 2e055695244..11afc533f17 100644 --- a/ld/testsuite/ld-powerpc/relax.s +++ b/ld/testsuite/ld-powerpc/relax.s @@ -4,3 +4,4 @@ _start: bl far bl near bl far + b _start diff --git a/ld/testsuite/ld-powerpc/relaxr.d b/ld/testsuite/ld-powerpc/relaxr.d index ce8cb9c7bf8..6e559843e64 100644 --- a/ld/testsuite/ld-powerpc/relaxr.d +++ b/ld/testsuite/ld-powerpc/relaxr.d @@ -10,7 +10,8 @@ Disassembly of section .text: 8: R_PPC_NONE \*ABS\* c: 48 00 00 19 bl 24 <_start\+0x24> c: R_PPC_NONE \*ABS\* - 10: 48 00 00 24 b 34 <_start\+0x34> + 10: 48 00 00 00 b 10 <_start\+0x10> + 10: R_PPC_REL24 _start 14: 3d 80 00 00 lis r12,0 16: R_PPC_ADDR16_HA near 18: 39 8c 00 00 addi r12,r12,0 -- 2.30.2