diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d1c5a3bef8..b6a7c5ff43 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-01-12 Yury Usishchev + + * elf32-arm.c (elf32_arm_fix_exidx_coverage): Insert cantunwind + when address in first unwind entry does not match start of + section. + 2016-01-08 Richard Sandiford Jiong Wang diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index c594e656c6..1c52526b61 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -11740,6 +11740,18 @@ elf32_arm_fix_exidx_coverage (asection **text_section_order, /* An error? */ continue; + if (last_unwind_type > 0) + { + unsigned int first_word = bfd_get_32 (ibfd, contents); + /* Add cantunwind if first unwind item does not match section + start. */ + if (first_word != sec->vma) + { + insert_cantunwind_after (last_text_sec, last_exidx_sec); + last_unwind_type = 0; + } + } + for (j = 0; j < hdr->sh_size; j += 8) { unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4); diff --git a/ld/ChangeLog b/ld/ChangeLog index 09e51b501c..e2b1e3a16a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2016-01-12 Yury Usishchev + + * testsuite/ld-arm/arm-elf.exp: New test. + * testsuite/ld-arm/unwind-mix.d: New file. + * testsuite/ld-arm/unwind-mix1.s: New file. + * testsuite/ld-arm/unwind-mix2.s: New file. + 2016-01-08 Jiong Wang PR ld/19368 diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 1c5d3c1fe1..70ca829835 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -964,5 +964,8 @@ set arm_unwind_tests { {"unwind-rel" "-r -Tarm.ld" "" "" {unwind-rel1.s unwind-rel2.s unwind-rel3.s} {{readelf -ur unwind-rel.d}} "unwind-rel"} + {"unwind-mix" "-Tarm.ld" "" "" {unwind-mix1.s unwind-mix2.s} + {{readelf -u unwind-mix.d}} + "unwind-mix"} } run_ld_link_tests $arm_unwind_tests diff --git a/ld/testsuite/ld-arm/unwind-mix.d b/ld/testsuite/ld-arm/unwind-mix.d new file mode 100644 index 0000000000..8c157e1cc5 --- /dev/null +++ b/ld/testsuite/ld-arm/unwind-mix.d @@ -0,0 +1,20 @@ + +Unwind table index '\.ARM\.exidx' at offset .* contains 4 entries: + +0x8004 <_start>: @0x8010 + Compact model index: 1 + 0xc9 0x40 pop {D4} + 0xc9 0x00 pop {D0} + 0xa8 pop {r4, r14} + 0xb0 finish + +0x8008 <__aeabi_unwind_cpp_pr1>: 0x1 \[cantunwind\] + +0x800c : 0x80a8b0b0 + Compact model index: 0 + 0xa8 pop {r4, r14} + 0xb0 finish + 0xb0 finish + +0x8010 : 0x1 \[cantunwind\] + diff --git a/ld/testsuite/ld-arm/unwind-mix1.s b/ld/testsuite/ld-arm/unwind-mix1.s new file mode 100644 index 0000000000..36e5e0a441 --- /dev/null +++ b/ld/testsuite/ld-arm/unwind-mix1.s @@ -0,0 +1,16 @@ + .syntax unified + .text + .global __aeabi_unwind_cpp_pr0 + .type __aeabi_unwind_cpp_pr0, %function +__aeabi_unwind_cpp_pr0: + bx lr + + .global _start + .type _start, %function +_start: + .fnstart + .save {r4, lr} + .vsave {d0} + .vsave {d4} + bx lr + .fnend diff --git a/ld/testsuite/ld-arm/unwind-mix2.s b/ld/testsuite/ld-arm/unwind-mix2.s new file mode 100644 index 0000000000..5301edbc9b --- /dev/null +++ b/ld/testsuite/ld-arm/unwind-mix2.s @@ -0,0 +1,15 @@ + .syntax unified + .text + .global __aeabi_unwind_cpp_pr1 + .type __aeabi_unwind_cpp_pr1, %function +__aeabi_unwind_cpp_pr1: + bx lr + + .global end + .type end, %function +end: + .fnstart + .save {r4, lr} + bx lr + .fnend +