This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix garbage collection of common symbols


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c4621b339e6f3153649898b254685f72df8c013d

commit c4621b339e6f3153649898b254685f72df8c013d
Author: Alan Modra <amodra@gmail.com>
Date:   Sat Jan 17 21:33:43 2015 +1030

    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:
---
 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 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
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c7847a1..e9c3ed3 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 9f3d209..0c72333 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 4f59af8..d08ff1a 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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
diff --git a/ld/testsuite/ld-cris/tls-gc-68.d b/ld/testsuite/ld-cris/tls-gc-68.d
index 6d3121b..b7fc374 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 482088c..c4c51b7 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 83b4c0b..6ab8f24 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 b580fd3..9d87500 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 472f889..c2d5df4 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 97edbef..2bcf25c 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 424bfb0..f4916d3 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 04af982..f78297b 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 1bc6269..1cb7d61 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 7f47450..9b38be8 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  .*


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]