From: Alan Modra Date: Sat, 17 Jan 2015 11:03:43 +0000 (+1030) Subject: Fix garbage collection of common symbols X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c4621b339e6f3153649898b254685f72df8c013d;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5b03d1c3678..ab45ad86811 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 da7c5220744..49ffe797af5 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 f2ab71d58b7..26af87085d2 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 c7847a1806d..e9c3ed38076 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 9f3d209dfd1..0c72333499c 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 4f59af8360a..d08ff1a0aa9 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 6d3121b9a5b..b7fc3743a57 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 482088ce99f..c4c51b7128f 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 83b4c0bfe06..6ab8f24231c 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 b580fd3e035..9d8750038f8 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 472f889bbf4..c2d5df47309 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 97edbef1198..2bcf25c27ea 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 424bfb0af07..f4916d3f356 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 04af9825c1d..f78297b12af 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 1bc6269f592..1cb7d611eea 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 7f47450d438..9b38be8913b 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 .*