From 1a766c6843ce0005fee23633b3b30c98e81a7b07 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 16 Sep 2011 01:17:16 +0000 Subject: [PATCH] Also hide symbols without PLT nor GOT references. bfd/ 2011-09-15 H.J. Lu PR ld/13177 * elflink.c (elf_gc_sweep_symbol): Also hide symbols without PLT nor GOT references. ld/testsuite/ 2011-09-15 H.J. Lu PR ld/13177 * ld-elf/pr13177.d: New. * ld-elf/pr13177.s: Likewise. --- bfd/ChangeLog | 6 ++++++ bfd/elflink.c | 15 ++++++++++----- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-elf/pr13177.d | 11 +++++++++++ ld/testsuite/ld-elf/pr13177.s | 9 +++++++++ 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr13177.d create mode 100644 ld/testsuite/ld-elf/pr13177.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b063de9ac9..352128984f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2011-09-15 H.J. Lu + + PR ld/13177 + * elflink.c (elf_gc_sweep_symbol): Also hide symbols without PLT + nor GOT references. + 2011-09-15 H.J. Lu PR ld/12975 diff --git a/bfd/elflink.c b/bfd/elflink.c index 2560104240..9ccf37df05 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -11689,13 +11689,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/ChangeLog b/ld/testsuite/ChangeLog index 7a90b261e8..c5349be630 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-09-15 H.J. Lu + + PR ld/13177 + * ld-elf/pr13177.d: New. + * ld-elf/pr13177.s: Likewise. + 2011-09-15 H.J. Lu PR ld/12975 diff --git a/ld/testsuite/ld-elf/pr13177.d b/ld/testsuite/ld-elf/pr13177.d new file mode 100644 index 0000000000..425a239826 --- /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 0000000000..25232ba1fa --- /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