diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 15 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr13177.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr13177.s | 9 |
5 files changed, 42 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b063de9..3521289 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + PR ld/13177 + * elflink.c (elf_gc_sweep_symbol): Also hide symbols without PLT + nor GOT references. + +2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + PR ld/12975 * bfd-in.h (bfd_elf_size_dynamic_sections): Remove pointer to struct bfd_elf_version_tree. diff --git a/bfd/elflink.c b/bfd/elflink.c index 2560104..9ccf37d 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 7a90b26..c5349be 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + PR ld/13177 + * ld-elf/pr13177.d: New. + * ld-elf/pr13177.s: Likewise. + +2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + PR ld/12975 * ld-elf/pr12975.d: New. * ld-elf/pr12975.s: Likewise. 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 |