Fix garbage collection of common symbols
authorAlan Modra <amodra@gmail.com>
Sat, 17 Jan 2015 11:03:43 +0000 (21:33 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 19 Jan 2015 10:56:30 +0000 (21:26 +1030)
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.

16 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elflink.c
ld/ChangeLog
ld/ldlang.c
ld/testsuite/ChangeLog
ld/testsuite/ld-cris/tls-gc-68.d
ld/testsuite/ld-cris/tls-gc-69.d
ld/testsuite/ld-cris/tls-gc-70.d
ld/testsuite/ld-cris/tls-gc-71.d
ld/testsuite/ld-cris/tls-gc-75.d
ld/testsuite/ld-cris/tls-gc-76.d
ld/testsuite/ld-cris/tls-gc-79.d
ld/testsuite/ld-gc/pr14265.d
ld/testsuite/ld-mmix/bpo-10.d
ld/testsuite/ld-mmix/bpo-11.d

index 5b03d1c3678331e794e4075bb38eb86c6127e798..ab45ad86811e441cabee13d1060ea5844ba176d0 100644 (file)
@@ -1,3 +1,11 @@
+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
index da7c5220744d5f1e4df26aba167c1ad060f5b2a5..49ffe797af5277892179e841a6f5e2d45d4406f7 100644 (file)
@@ -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                                                        \
index f2ab71d58b78276bf048f0d69a971979d55a494e..26af87085d2ebfcf3398d50acdee59c7d630961c 100644 (file)
@@ -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
index c7847a1806d047fe5f81b96a4c39bb45089f3417..e9c3ed38076d6eec4982246e99b638d7fca73c6e 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-19  Alan Modra  <amodra@gmail.com>
+
+       PR 17165
+       * ldlang.c (lang_process): Run lang_common before lang_gc_sections.
+
 2015-01-14  Jiong Wang  <jiong.wang@arm.com>
 
        * ld-arm/elf32-reject.s: New testcase.
index 9f3d209dfd1286f65ca4e815386763340b6ce7d8..0c72333499c7a7d7667d81e5a82085785da8951e 100644 (file)
@@ -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);
 
index 4f59af8360abb2f67db52f8540c12116e0eaa7ad..d08ff1a0aa9117968634170e93fba5cfa077a3c5 100644 (file)
@@ -1,3 +1,16 @@
+2015-01-19  Alan Modra  <amodra@gmail.com>
+
+       * 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  <krebbel@linux.vnet.ibm.com>
 
        * ld-s390/tlsbin.dd: The nopr register operand is optional and not
index 6d3121b9a5bdf17686181f11eb0c1a0a8bb7fc15..b7fc3743a576e6df06fa4dfb3f5ec2b618eaa14e 100644 (file)
@@ -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+                             .*
index 482088ce99f450d8fd01861b81e0546dac0cfe29..c4c51b7128fa602a6bd66559ecca682e732c21c5 100644 (file)
@@ -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+                             .*
index 83b4c0bfe060cddac679354b98e68f58aaa0133f..6ab8f24231c944815266c5ad4402bfcf0d1c4660 100644 (file)
@@ -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+                             .*
index b580fd3e035d7ca5e61d7f91cd57b9d571cdc93c..9d8750038f84a63a8849ace9c9d73b70be78ba04 100644 (file)
 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\)
 #...
index 472f889bbf41a5aa6a4745ba671a342231883f1f..c2d5df473097c99eec6d467f0586b6f7f6fd952a 100644 (file)
@@ -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+                             .*
index 97edbef11986d342b1e95140a244b98c5b692e15..2bcf25c27eabd9ceb0fe6cdb9dd61189a171c0e3 100644 (file)
@@ -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:
index 424bfb0af07e4c070b75218bfce4677f2279b1ff..f4916d3f356a0bd7ea0e490119eccb45a7f6f5a9 100644 (file)
@@ -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+                             .*
index 04af9825c1d6923663e9e13b569b6448d898946e..f78297b12af943fc830b7494669ce0bcb4ab25ff 100644 (file)
@@ -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
 #...
index 1bc6269f592b08c8db3b2c1c2f3de9c129a95f30..1cb7d611eea006d78df9f6eed00a5486d73387e1 100644 (file)
@@ -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                             .*
index 7f47450d4389dd0f12ea26e39a48484eae4803b9..9b38be8913b228d8b58713e4786fe5c53751c89d 100644 (file)
@@ -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  .*