From: Alan Modra Date: Sat, 17 Jan 2015 11:03:43 +0000 (+1030) Subject: Fix garbage collection of common symbols X-Git-Tag: binutils-2_25_1~230 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=25ea68d948d622c6067716fe3b32732966a527d1;p=thirdparty%2Fbinutils-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 97f5026ee6b..0300b59f7c7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,13 @@ 2015-02-11 Alan Modra Apply from master. + 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-15 Alan Modra * elflink.c (_bfd_elf_link_omit_section_dynsym): Return true for any output section matching a linker created dynobj section. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index f6cda65f294..5069376b57c 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 db387f0bcc0..d1d36db68d3 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -12068,7 +12068,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)) @@ -12291,7 +12291,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 c51672d2e5d..594fc280a9c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,6 +1,10 @@ 2015-02-11 Alan Modra Apply from master. + 2015-01-19 Alan Modra + PR 17165 + * ldlang.c (lang_process): Run lang_common before lang_gc_sections. + 2014-12-24 Alan Modra * emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Exclude shared libraries in loop looking for .eh_frame sections. diff --git a/ld/ldlang.c b/ld/ldlang.c index d65e01a857a..dc787b00898 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 8de9154d4b4..a5b868bca29 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,6 +1,18 @@ 2015-02-11 Alan Modra Apply from master. + 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. + 2014-12-23 Alan Modra * ld-powerpc/sdabase.s, * ld-powerpc/sdabase.t, 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 .*