From 1e81e12b2c81710f5b098e18d5146d6704100913 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 17 Jan 2011 16:36:15 +0000 Subject: [PATCH] bfd/ * elf32-arm.c (elf32_arm_gc_sweep_hook): Remove all registered dynamic relocs for the removed section. ld/testsuite/ * ld-arm/gc-thumb-lib.s, ld-arm/gc-thumb.s, ld-arm/gc-thumb.d: New test. * ld-arm/arm-elf.exp: Run it. --- bfd/ChangeLog | 5 +++++ bfd/elf32-arm.c | 22 +++++++--------------- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-arm/arm-elf.exp | 6 ++++++ ld/testsuite/ld-arm/gc-thumb-lib.s | 6 ++++++ ld/testsuite/ld-arm/gc-thumb.d | 2 ++ ld/testsuite/ld-arm/gc-thumb.s | 11 +++++++++++ 7 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 ld/testsuite/ld-arm/gc-thumb-lib.s create mode 100644 ld/testsuite/ld-arm/gc-thumb.d create mode 100644 ld/testsuite/ld-arm/gc-thumb.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 00ff8ff..93291ef 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-01-17 Richard Sandiford + + * elf32-arm.c (elf32_arm_gc_sweep_hook): Remove all registered + dynamic relocs for the removed section. + 2011-01-15 H.J. Lu * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32 diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 6fdd500..8e9e30f 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -11277,21 +11277,13 @@ elf32_arm_gc_sweep_hook (bfd * abfd, eh->plt_thumb_refcount--; } - if (r_type == R_ARM_ABS32 - || r_type == R_ARM_REL32 - || r_type == R_ARM_ABS32_NOI - || r_type == R_ARM_REL32_NOI) - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - p->count -= 1; - if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32 - || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI) - p->pc_count -= 1; - if (p->count == 0) - *pp = p->next; - break; - } + for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) + if (p->sec == sec) + { + /* Everything must go for SEC. */ + *pp = p->next; + break; + } } break; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3b10b2d..fd92f26 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-01-17 Richard Sandiford + + * ld-arm/gc-thumb-lib.s, ld-arm/gc-thumb.s, + ld-arm/gc-thumb.d: New test. + * ld-arm/arm-elf.exp: Run it. + 2011-01-14 H.J. Lu * ld-x86-64/ia32-2.d: Replace --n32 with --x32. diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 9ba7b56..9efdaf0 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -261,6 +261,12 @@ set armelftests { {"Unwinding and -gc-sections" "-gc-sections" "" {gc-unwind.s} {{objdump -sj.data gc-unwind.d}} "gc-unwind"} + {"Thumb and -gc-sections" "-shared -T arm-dyn.ld" "" {gc-thumb-lib.s} + {} + "gc-thumb-lib.so"} + {"Thumb and -gc-sections" "-pie -T arm.ld -gc-sections tmpdir/gc-thumb-lib.so" "" {gc-thumb.s} + {{readelf --relocs gc-thumb.d}} + "gc-thumb"} {"arm-pic-veneer" "-static -T arm.ld --pic-veneer" "" {arm-pic-veneer.s} {{objdump -d arm-pic-veneer.d}} "arm-pic-veneer"} diff --git a/ld/testsuite/ld-arm/gc-thumb-lib.s b/ld/testsuite/ld-arm/gc-thumb-lib.s new file mode 100644 index 0000000..2065d35 --- /dev/null +++ b/ld/testsuite/ld-arm/gc-thumb-lib.s @@ -0,0 +1,6 @@ + .data + .globl foo + .type foo,%object + .size foo,4 +foo: + .word 0 diff --git a/ld/testsuite/ld-arm/gc-thumb.d b/ld/testsuite/ld-arm/gc-thumb.d new file mode 100644 index 0000000..9a75562 --- /dev/null +++ b/ld/testsuite/ld-arm/gc-thumb.d @@ -0,0 +1,2 @@ + +There are no relocations in this file\. diff --git a/ld/testsuite/ld-arm/gc-thumb.s b/ld/testsuite/ld-arm/gc-thumb.s new file mode 100644 index 0000000..4051f8d --- /dev/null +++ b/ld/testsuite/ld-arm/gc-thumb.s @@ -0,0 +1,11 @@ + .arch armv7-a + .syntax unified + .text + .globl _start +_start: + mov pc,lr + + .section .text.foo,"ax",%progbits + .thumb + movw r0,#:lower16:foo-. + movt r0,#:upper16:foo-. -- 2.7.4