bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 17 Jan 2011 16:36:15 +0000 (16:36 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Mon, 17 Jan 2011 16:36:15 +0000 (16:36 +0000)
* 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
bfd/elf32-arm.c
ld/testsuite/ChangeLog
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/gc-thumb-lib.s [new file with mode: 0644]
ld/testsuite/ld-arm/gc-thumb.d [new file with mode: 0644]
ld/testsuite/ld-arm/gc-thumb.s [new file with mode: 0644]

index 00ff8ff..93291ef 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-17  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * elf32-arm.c (elf32_arm_gc_sweep_hook): Remove all registered
+       dynamic relocs for the removed section.
+
 2011-01-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32
index 6fdd500..8e9e30f 100644 (file)
@@ -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;
 
index 3b10b2d..fd92f26 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-17  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * 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  <hongjiu.lu@intel.com>
 
        * ld-x86-64/ia32-2.d: Replace --n32 with --x32.
index 9ba7b56..9efdaf0 100644 (file)
@@ -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 (file)
index 0000000..2065d35
--- /dev/null
@@ -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 (file)
index 0000000..9a75562
--- /dev/null
@@ -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 (file)
index 0000000..4051f8d
--- /dev/null
@@ -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-.