From c4621b339e6f3153649898b254685f72df8c013d Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 17 Jan 2015 21:33:43 +1030 Subject: [PATCH] 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. --- bfd/ChangeLog | 8 ++++++++ bfd/elf-bfd.h | 3 ++- bfd/elflink.c | 4 ++-- ld/ChangeLog | 5 +++++ ld/ldlang.c | 6 +++--- ld/testsuite/ChangeLog | 13 +++++++++++++ ld/testsuite/ld-cris/tls-gc-68.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-69.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-70.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-71.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-75.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-76.d | 6 +++--- ld/testsuite/ld-cris/tls-gc-79.d | 6 +++--- ld/testsuite/ld-gc/pr14265.d | 8 ++++---- ld/testsuite/ld-mmix/bpo-10.d | 6 +++--- ld/testsuite/ld-mmix/bpo-11.d | 6 +++--- 16 files changed, 64 insertions(+), 37 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5b03d1c367..ab45ad8681 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2015-01-19 Alan Modra + + 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 * elf32-bfin.c (bfin_bfd_reloc_type_lookup): Correct loop iteration diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index da7c522074..49ffe797af 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 f2ab71d58b..26af87085d 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 diff --git a/ld/ChangeLog b/ld/ChangeLog index c7847a1806..e9c3ed3807 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2015-01-19 Alan Modra + + PR 17165 + * ldlang.c (lang_process): Run lang_common before lang_gc_sections. + 2015-01-14 Jiong Wang * ld-arm/elf32-reject.s: New testcase. diff --git a/ld/ldlang.c b/ld/ldlang.c index 9f3d209dfd..0c72333499 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -6701,12 +6701,12 @@ lang_process (void) lang_do_assignments (lang_mark_phase_enum); expld.phase = lang_first_phase_enum; - /* Remove unreferenced sections if asked to. */ - lang_gc_sections (); - /* Size up the common data. */ lang_common (); + /* Remove unreferenced sections if asked to. */ + lang_gc_sections (); + /* Update wild statements. */ update_wild_statements (statement_list.head); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 4f59af8360..d08ff1a0aa 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2015-01-19 Alan Modra + + * 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. + 2015-01-16 Andreas Krebbel * ld-s390/tlsbin.dd: The nopr register operand is optional and not diff --git a/ld/testsuite/ld-cris/tls-gc-68.d b/ld/testsuite/ld-cris/tls-gc-68.d index 6d3121b9a5..b7fc3743a5 100644 --- a/ld/testsuite/ld-cris/tls-gc-68.d +++ b/ld/testsuite/ld-cris/tls-gc-68.d @@ -21,11 +21,11 @@ private flags = 0: SYMBOL TABLE: 0+80074 l d \.text 0+ \.text 0+82078 l d \.got 0+ \.got -0+82084 l \.got 0+ __bss_start -0+82084 l \.got 0+ _edata 0+82078 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.got 0+ _end 0+80074 g \.text 0+ _start +0+82084 g \.got 0+ __bss_start +0+82084 g \.got 0+ _edata +0+820a0 g \.got 0+ _end Contents of section \.text: 80074 41b20+ .* diff --git a/ld/testsuite/ld-cris/tls-gc-69.d b/ld/testsuite/ld-cris/tls-gc-69.d index 482088ce99..c4c51b7128 100644 --- a/ld/testsuite/ld-cris/tls-gc-69.d +++ b/ld/testsuite/ld-cris/tls-gc-69.d @@ -22,11 +22,11 @@ private flags = 0: SYMBOL TABLE: 0+80074 l d \.text 0+ \.text 0+82078 l d \.got 0+ \.got -0+82084 l \.got 0+ __bss_start -0+82084 l \.got 0+ _edata 0+82078 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.got 0+ _end 0+80074 g \.text 0+ _start +0+82084 g \.got 0+ __bss_start +0+82084 g \.got 0+ _edata +0+820a0 g \.got 0+ _end Contents of section .text: 80074 41b20+ .* diff --git a/ld/testsuite/ld-cris/tls-gc-70.d b/ld/testsuite/ld-cris/tls-gc-70.d index 83b4c0bfe0..6ab8f24231 100644 --- a/ld/testsuite/ld-cris/tls-gc-70.d +++ b/ld/testsuite/ld-cris/tls-gc-70.d @@ -22,11 +22,11 @@ private flags = 0: SYMBOL TABLE: 0+80074 l d \.text 0+ \.text 0+82078 l d \.got 0+ \.got -0+82084 l \.got 0+ __bss_start -0+82084 l \.got 0+ _edata 0+82078 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.got 0+ _end 0+80074 g \.text 0+ _start +0+82084 g \.got 0+ __bss_start +0+82084 g \.got 0+ _edata +0+820a0 g \.got 0+ _end Contents of section \.text: 80074 41b20+ .* diff --git a/ld/testsuite/ld-cris/tls-gc-71.d b/ld/testsuite/ld-cris/tls-gc-71.d index b580fd3e03..9d8750038f 100644 --- a/ld/testsuite/ld-cris/tls-gc-71.d +++ b/ld/testsuite/ld-cris/tls-gc-71.d @@ -17,11 +17,11 @@ DYNAMIC SYMBOL TABLE: 0+18e l d \.text 0+ \.text 0+2194 l d \.tdata 0+ \.tdata -0+2280 l D \.got 0+ __bss_start -0+2280 l D \.got 0+ _edata -0+2280 l D \.got 0+ _end 0+18e g DF \.text 0+2 _init +0+2280 g D \.got 0+ __bss_start 0+ g D .tdata 0+80 tls128 +0+2280 g D \.got 0+ _edata +0+2280 g D \.got 0+ _end DYNAMIC RELOCATION RECORDS \(none\) #... diff --git a/ld/testsuite/ld-cris/tls-gc-75.d b/ld/testsuite/ld-cris/tls-gc-75.d index 472f889bbf..c2d5df4730 100644 --- a/ld/testsuite/ld-cris/tls-gc-75.d +++ b/ld/testsuite/ld-cris/tls-gc-75.d @@ -24,11 +24,11 @@ private flags = 0: SYMBOL TABLE: 0+80074 l d \.text 0+ \.text 0+82078 l d \.got 0+ \.got -0+82084 l \.got 0+ __bss_start -0+82084 l \.got 0+ _edata 0+82078 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.got 0+ _end 0+80074 g \.text 0+ _start +0+82084 g \.got 0+ __bss_start +0+82084 g \.got 0+ _edata +0+820a0 g \.got 0+ _end Contents of section \.text: 80074 41b20+ .* diff --git a/ld/testsuite/ld-cris/tls-gc-76.d b/ld/testsuite/ld-cris/tls-gc-76.d index 97edbef119..2bcf25c27e 100644 --- a/ld/testsuite/ld-cris/tls-gc-76.d +++ b/ld/testsuite/ld-cris/tls-gc-76.d @@ -25,11 +25,11 @@ SYMBOL TABLE: 0+ l df \*ABS\* 0+ .* 0+82090 l O \.data 0+4 gc76var 0+ l df \*ABS\* 0+ .* -0+82094 l \.data 0+ __bss_start -0+82094 l \.data 0+ _edata 0+82080 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.data 0+ _end 0+80074 g \.text 0+ _start +0+82094 g \.data 0+ __bss_start +0+82094 g \.data 0+ _edata +0+820a0 g \.data 0+ _end 0+80078 g F \.text 0+6 gc76fn Contents of section \.text: diff --git a/ld/testsuite/ld-cris/tls-gc-79.d b/ld/testsuite/ld-cris/tls-gc-79.d index 424bfb0af0..f4916d3f35 100644 --- a/ld/testsuite/ld-cris/tls-gc-79.d +++ b/ld/testsuite/ld-cris/tls-gc-79.d @@ -22,11 +22,11 @@ private flags = 0: SYMBOL TABLE: 0+80074 l d \.text 0+ \.text 0+82078 l d \.got 0+ \.got -0+82084 l \.got 0+ __bss_start -0+82084 l \.got 0+ _edata 0+82078 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+820a0 l \.got 0+ _end 0+80074 g \.text 0+ _start +0+82084 g \.got 0+ __bss_start +0+82084 g \.got 0+ _edata +0+820a0 g \.got 0+ _end Contents of section \.text: 80074 41b20+ .* diff --git a/ld/testsuite/ld-gc/pr14265.d b/ld/testsuite/ld-gc/pr14265.d index 04af9825c1..f78297b12a 100644 --- a/ld/testsuite/ld-gc/pr14265.d +++ b/ld/testsuite/ld-gc/pr14265.d @@ -4,10 +4,10 @@ #nm: --format=bsd --numeric-sort #... -[0-9a-f]+[ ]d[ ]_*foo1_start +[0-9a-f]+[ ][dD][ ]_*foo1_start [0-9a-f]+[ ]D[ ]_*foo1 -[0-9a-f]+[ ]d[ ]_*foo1_end -[0-9a-f]+[ ]d[ ]_*foo2_start +[0-9a-f]+[ ][dD][ ]_*foo1_end +[0-9a-f]+[ ][dD][ ]_*foo2_start [0-9a-f]+[ ]D[ ]_*foo2 -[0-9a-f]+[ ]d[ ]_*foo2_end +[0-9a-f]+[ ][dD][ ]_*foo2_end #... diff --git a/ld/testsuite/ld-mmix/bpo-10.d b/ld/testsuite/ld-mmix/bpo-10.d index 1bc6269f59..1cb7d611ee 100644 --- a/ld/testsuite/ld-mmix/bpo-10.d +++ b/ld/testsuite/ld-mmix/bpo-10.d @@ -15,10 +15,10 @@ SYMBOL TABLE: 0+ l df \*ABS\* 0+ .* 0+ l \.init 0+ _start 0+ l df \*ABS\* 0+ .* -2000000000000000 l \.init 0+ __bss_start -2000000000000000 l \.init 0+ _edata -2000000000000000 l \.init 0+ _end 0+4 l \.init 0+ _start\. +2000000000000000 g \.init 0+ __bss_start +2000000000000000 g \.init 0+ _edata +2000000000000000 g \.init 0+ _end Contents of section \.init: 0000 e37704a6 .* diff --git a/ld/testsuite/ld-mmix/bpo-11.d b/ld/testsuite/ld-mmix/bpo-11.d index 7f47450d43..9b38be8913 100644 --- a/ld/testsuite/ld-mmix/bpo-11.d +++ b/ld/testsuite/ld-mmix/bpo-11.d @@ -17,12 +17,12 @@ SYMBOL TABLE: 0+ l df \*ABS\* 0+ .* 0+ l \.init 0+ _start 0+ l df \*ABS\* 0+ .* -2000000000000000 l \.text 0+ __bss_start -2000000000000000 l \.text 0+ _edata -2000000000000000 l \.text 0+ _end 0+10 l \.text 0+ _start\. 0+14 g \.text 0+ x 0+10 g \.text 0+ x2 +2000000000000000 g \.text 0+ __bss_start +2000000000000000 g \.text 0+ _edata +2000000000000000 g \.text 0+ _end Contents of section \.init: 0000 00000000 0000003d 00000000 0000003a .* -- 2.34.1