aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-ppc.c18
-rw-r--r--ld/testsuite/ChangeLog6
-rw-r--r--ld/testsuite/ld-powerpc/relax.d2
-rw-r--r--ld/testsuite/ld-powerpc/relax.s1
-rw-r--r--ld/testsuite/ld-powerpc/relaxr.d3
6 files changed, 27 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6c4dbf5..ade0511 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-06 Alan Modra <amodra@gmail.com>
+
+ * elf32-ppc.c (ppc_elf_relax_section): Insert branch around
+ trampolines only for .init and .fini sections.
+
2010-07-05 Alan Modra <amodra@gmail.com>
* elf32-ppc.c: Formatting.
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 60adae8..e3638cd 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 fdd6a50..463a14c 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-06 Alan Modra <amodra@gmail.com>
+
+ * ld-powerpc/relax.s: Add branch back to _start.
+ * ld-powerpc/relax.d: Update.
+ * ld-powerpc/relaxr.d: Update.
+
2010-07-01 Alan Modra <amodra@gmail.com>
* 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 51d253b..5a6b3dd 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 <near>
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 2e05569..11afc53 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 ce8cb9c..6e55984 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