This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR ld/13177: garbage collector retains zombie references to external libraries
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Wed, 14 Sep 2011 12:14:38 -0700
- Subject: PATCH: PR ld/13177: garbage collector retains zombie references to external libraries
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
We shoul also remove symbols without PLT nor GOT references from dynamic
symbol table. OK to install?
Thanks.
H.J.
---
bfd/
2011-09-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/13177
* elflink.c (elf_gc_sweep_symbol): Also hide symbols without PLT
nor GOT references.
ld/testsuite/
2011-09-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/13177
* ld-elf/pr13177.d: New.
* ld-elf/pr13177.s: Likewise.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 528f705..5a703b3 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -11694,13 +11694,18 @@ struct elf_gc_sweep_symbol_info
static bfd_boolean
elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data)
{
- if ((h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- && !h->root.u.def.section->gc_mark
- && !(h->root.u.def.section->owner->flags & DYNAMIC))
+ if (((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && !h->root.u.def.section->gc_mark
+ && (!(h->root.u.def.section->owner->flags & DYNAMIC)
+ || (h->plt.refcount <= 0
+ && h->got.refcount <= 0)))
+ || (h->root.type == bfd_link_hash_undefined
+ && h->plt.refcount <= 0
+ && h->got.refcount <= 0))
{
struct elf_gc_sweep_symbol_info *inf =
- (struct elf_gc_sweep_symbol_info *) data;
+ (struct elf_gc_sweep_symbol_info *) data;
(*inf->hide_symbol) (inf->info, h, TRUE);
}
diff --git a/ld/testsuite/ld-elf/pr13177.d b/ld/testsuite/ld-elf/pr13177.d
new file mode 100644
index 0000000..425a239
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr13177.d
@@ -0,0 +1,11 @@
+#source: pr13177.s
+#ld: --gc-sections -shared
+#readelf: -s -D --wide
+#notarget: arc-*-* d30v-*-* dlx-*-* i960-*-* or32-*-* pj*-*-*
+#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
+# generic linker targets don't support --gc-sections, nor do a bunch of others
+
+#failif
+#...
+.*: 0+0 +0 +NOTYPE +GLOBAL +DEFAULT +UND bar
+#...
diff --git a/ld/testsuite/ld-elf/pr13177.s b/ld/testsuite/ld-elf/pr13177.s
new file mode 100644
index 0000000..25232ba
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr13177.s
@@ -0,0 +1,9 @@
+ .section .text.foo,"ax",%progbits
+ .globl foo
+ .type foo, %function
+foo:
+ .byte 0
+ .section .text.opt_out,"ax",%progbits
+ .type opt_out, %function
+opt_out:
+ .dc.a bar