From ee5210332dd5ddbd3f3072b7d225fb0b0a3ff131 Mon Sep 17 00:00:00 2001 From: Christophe Lyon Date: Fri, 6 Mar 2009 08:57:58 +0000 Subject: [PATCH] 09-03-05 Christophe Lyon bfd/ * elf32-arm.c (group_sections): Take next section size into account before accepting to group it. testsuite/ * ld-arm/arm-elf.exp: Add new farcall-group-limit test. * ld-arm/farcall-group-limit.d: New file. * ld-arm/farcall-group3.s: New file. * ld-arm/farcall-group4.s: New file. --- bfd/ChangeLog | 5 +++++ bfd/elf32-arm.c | 32 +++++++++++++++++++++++-------- ld/testsuite/ChangeLog | 7 +++++++ ld/testsuite/ld-arm/arm-elf.exp | 3 +++ ld/testsuite/ld-arm/farcall-group-limit.d | 21 ++++++++++++++++++++ ld/testsuite/ld-arm/farcall-group3.s | 9 +++++++++ ld/testsuite/ld-arm/farcall-group4.s | 13 +++++++++++++ 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 ld/testsuite/ld-arm/farcall-group-limit.d create mode 100644 ld/testsuite/ld-arm/farcall-group3.s create mode 100644 ld/testsuite/ld-arm/farcall-group4.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index bc12f9f328..f15e157dd8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2009-03-05 Christophe Lyon + * elf32-arm.c (group_sections): Take next section size into + account before accepting to group it. + +2009-03-05 Christophe Lyon + * elf32-arm.c (arm_type_of_stub): Handle long branches targetting PLT entries. (elf32_arm_final_link_relocate): Likewise. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 607ba04ada..f534290ee8 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -3554,11 +3554,20 @@ group_sections (struct elf32_arm_link_hash_table *htab, bfd_size_type total; curr = head; - total = head->size; - while ((next = NEXT_SEC (curr)) != NULL - && ((total += next->output_offset - curr->output_offset) - < stub_group_size)) + total = 0; + while ((next = NEXT_SEC (curr)) != NULL) + { + if ( (total + next->output_offset - curr->output_offset + + next->size) + < stub_group_size ) + { + total += next->output_offset - curr->output_offset; + } + else + break; + curr = next; + } /* OK, the size from the start to the start of CURR is less than stub_group_size and thus can be handled by one stub @@ -3579,11 +3588,18 @@ group_sections (struct elf32_arm_link_hash_table *htab, bytes after the stub section can be handled by it too. */ if (!stubs_always_after_branch) { - total = 0; - while (next != NULL - && ((total += next->output_offset - head->output_offset) - < stub_group_size)) + total = head->size; + while (next != NULL) { + if ( (total + next->output_offset - head->output_offset + + next->size) + < stub_group_size ) + { + total += next->output_offset - head->output_offset; + } + else + break; + head = next; next = NEXT_SEC (head); htab->stub_group[head->id].link_sec = curr; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 693a93bde9..9c9f1e7bc3 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2009-03-05 Christophe Lyon + * ld-arm/arm-elf.exp: Add new farcall-group-limit test. + * ld-arm/farcall-group-limit.d: New file. + * ld-arm/farcall-group3.s: New file. + * ld-arm/farcall-group4.s: New file. + +2009-03-05 Christophe Lyon + * ld-arm/arm-elf.exp: Add 2 more tests to check long branch stubs in PLT context. * ld-arm/farcall-mixed-app-v5.d: New file. diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 0dfc44188c..b9c7513a50 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -338,6 +338,9 @@ set armeabitests { {"Group size=2" "-Ttext 0x1000 --section-start .foo=0x2003020 --stub-group-size=2" "" {farcall-group.s farcall-group2.s} {{objdump -d farcall-group-size2.d}} "farcall-group-size2"} + {"Group size limit" "-Ttext 0x1000 --section-start .far=0x2003020" "" {farcall-group3.s farcall-group4.s} + {{objdump -d farcall-group-limit.d}} + "farcall-group-limit"} {"Mixed ARM/Thumb dynamic application with farcalls" "tmpdir/mixed-lib.so -T arm-dyn.ld --section-start .far_arm=0x2100000 --section-start .far_thumb=0x2200000" "" {farcall-mixed-app.s} diff --git a/ld/testsuite/ld-arm/farcall-group-limit.d b/ld/testsuite/ld-arm/farcall-group-limit.d new file mode 100644 index 0000000000..204dcd8120 --- /dev/null +++ b/ld/testsuite/ld-arm/farcall-group-limit.d @@ -0,0 +1,21 @@ + +.*: file format .* + +Disassembly of section .text: + +00001000 <_start>: + 1000: eb000000 bl 1008 <__bar_veneer> + 1004: 00000000 andeq r0, r0, r0 + +00001008 <__bar_veneer>: + 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> + 100c: 02003020 .word 0x02003020 + +00001010 : + ... + 2001010: eb000802 bl 2003020 + +Disassembly of section .far: + +02003020 : + 2003020: e12fff1e bx lr diff --git a/ld/testsuite/ld-arm/farcall-group3.s b/ld/testsuite/ld-arm/farcall-group3.s new file mode 100644 index 0000000000..ea2ce7f1e7 --- /dev/null +++ b/ld/testsuite/ld-arm/farcall-group3.s @@ -0,0 +1,9 @@ +@ Test to ensure that ARM calls exceeding 32Mb generate stubs, +@ and that stubs are correctly inserted between input sections +@ when one contribution size exceeds the limit. + + .text + .global bar + .global _start +_start: + bl bar diff --git a/ld/testsuite/ld-arm/farcall-group4.s b/ld/testsuite/ld-arm/farcall-group4.s new file mode 100644 index 0000000000..17f503bf66 --- /dev/null +++ b/ld/testsuite/ld-arm/farcall-group4.s @@ -0,0 +1,13 @@ +@ Test to ensure that ARM calls exceeding 32Mb generate stubs, +@ and that a large input section forces stub insertion before its +@ contribution. + + .text +myfunc: + .space 0x2000000 + bl bar + + .section .far, "xa" + .global bar +bar: + bx lr -- 2.11.0