aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-01-17 21:33:43 +1030
committerAlan Modra <amodra@gmail.com>2015-01-19 21:26:30 +1030
commitc4621b339e6f3153649898b254685f72df8c013d (patch)
tree4072fc9a77851dc3acf41c40b3452db137a2c7a5 /bfd
parent740bdc67c057ee8012327420848eb134e1db4211 (diff)
downloadgdb-c4621b339e6f3153649898b254685f72df8c013d.zip
gdb-c4621b339e6f3153649898b254685f72df8c013d.tar.gz
gdb-c4621b339e6f3153649898b254685f72df8c013d.tar.bz2
Fix garbage collection of common symbols
Running lang_common before garbage collection means slightly less work in garbage collection code, since common symbols should no longer appear there. It does have the side effect of keeping linker script symbols (at least those defined outside of sections) global too, hence some testsuite churn. bfd/ PR 17165 * elf-bfd.h (ELF_COMMON_DEF): Note that this might be true for linker script assignments too. * elflink.c (elf_gc_sweep_symbol): Don't drop ELF_COMMON_DEF syms. (bfd_elf_gc_mark_dynamic_ref_symbol): Similarly. ld/ PR 17165 * ldlang.c (lang_process): Run lang_common before lang_gc_sections. ld/testsuite/ * ld-gc/pr14265.d, * ld-cris/tls-gc-68.d, * ld-cris/tls-gc-69.d, * ld-cris/tls-gc-70.d, * ld-cris/tls-gc-71.d, * ld-cris/tls-gc-75.d, * ld-cris/tls-gc-76.d, * ld-cris/tls-gc-79.d, * ld-mmix/bpo-10.d, * ld-mmix/bpo-11.d: Update.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf-bfd.h3
-rw-r--r--bfd/elflink.c4
3 files changed, 12 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 5b03d1c..ab45ad8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,13 @@
2015-01-19 Alan Modra <amodra@gmail.com>
+ PR 17165
+ * elf-bfd.h (ELF_COMMON_DEF_P): Note that this might be true for
+ linker script assignments too.
+ * elflink.c (elf_gc_sweep_symbol): Don't drop ELF_COMMON_DEF syms.
+ (bfd_elf_gc_mark_dynamic_ref_symbol): Similarly.
+
+2015-01-19 Alan Modra <amodra@gmail.com>
+
* elf32-bfin.c (bfin_bfd_reloc_type_lookup): Correct loop iteration
to allow return of first howto.
* elf32-fr30.c (fr30_reloc_type_lookup): Likewise.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index da7c522..49ffe79 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -241,7 +241,8 @@ struct elf_link_hash_entry
_bfd_elf_symbol_refs_local_p (H, INFO, 1)
/* Common symbols that are turned into definitions don't have the
- DEF_REGULAR flag set, so they might appear to be undefined. */
+ DEF_REGULAR flag set, so they might appear to be undefined.
+ Symbols defined in linker scripts also don't have DEF_REGULAR set. */
#define ELF_COMMON_DEF_P(H) \
(!(H)->def_regular \
&& !(H)->def_dynamic \
diff --git a/bfd/elflink.c b/bfd/elflink.c
index f2ab71d..26af870 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12113,7 +12113,7 @@ elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data)
if (!h->mark
&& (((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
- && !(h->def_regular
+ && !((h->def_regular || ELF_COMMON_DEF_P (h))
&& h->root.u.def.section->gc_mark))
|| h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak))
@@ -12336,7 +12336,7 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& (h->ref_dynamic
- || (h->def_regular
+ || ((h->def_regular || ELF_COMMON_DEF_P (h))
&& ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
&& ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
&& (!info->executable