This is the mail archive of the binutils@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]

Re: Drop undefined local symbols from symtab?


On Wed, Feb 18, 2015 at 11:18:47PM +1030, Alan Modra wrote:
> On Wed, Feb 18, 2015 at 03:34:43AM -0800, H.J. Lu wrote:
> > Can you also strip undefined global symbols:
> > 
> > https://sourceware.org/bugzilla/show_bug.cgi?id=4317
> 
> Probably.  I'll take a look tomorrow.  Most likely just a matter of
> replacing the ELF_ST_BIND test in my elf_link_output_extsym change
> with a test of !flinfo->info->relocatable.  And perhaps arranging to
> only strip from .symtab if the sym isn't emitted to .dynsym.

I also took out the hack for __ehdr_start.

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 44fc2bb..71f258f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2015-02-19  Alan Modra  <amodra@gmail.com>
+
+	PR ld/4317
+	* elflink.c (elf_link_input_bfd): Drop undefined local syms.
+	(elf_link_output_extsym): Drop local and global undefined syms.
+	Tidy.  Expand comment.
+
 2015-02-17  Alan Modra  <amodra@gmail.com>
 
 	PR ld/17975
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 038e43d..0cd85f1 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -8902,8 +8902,9 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
      a regular file, or that we have been told to strip.  However, if
      h->indx is set to -2, the symbol is used by a reloc and we must
      output it.  */
+  strip = FALSE;
   if (h->indx == -2)
-    strip = FALSE;
+    ;
   else if ((h->def_dynamic
 	    || h->ref_dynamic
 	    || h->root.type == bfd_link_hash_new)
@@ -8929,12 +8930,11 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
 	   && h->root.u.undef.abfd != NULL
 	   && (h->root.u.undef.abfd->flags & BFD_PLUGIN) != 0)
     strip = TRUE;
-  else
-    strip = FALSE;
 
   /* If we're stripping it, and it's not a dynamic symbol, there's
-     nothing else to do unless it is a forced local symbol or a
-     STT_GNU_IFUNC symbol.  */
+     nothing else to do.   However, if it is a forced local symbol or
+     an ifunc symbol we need to give the backend finish_dynamic_symbol
+     function a chance to make it dynamic.  */
   if (strip
       && h->dynindx == -1
       && h->type != STT_GNU_IFUNC
@@ -9205,9 +9205,18 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
 	}
     }
 
-  /* If we're stripping it, then it was just a dynamic symbol, and
-     there's nothing else to do.  */
-  if (strip || (input_sec->flags & SEC_EXCLUDE) != 0)
+  /* If the symbol is undefined, and we didn't output it to .dynsym,
+     strip it from .symtab too.  Obviously we can't do this for
+     relocatable output or when needed for --emit-relocs.  */
+  else if (input_sec == bfd_und_section_ptr
+	   && h->indx != -2
+	   && !flinfo->info->relocatable)
+    return TRUE;
+  /* Also strip others that we couldn't earlier due to dynamic symbol
+     processing.  */
+  if (strip)
+    return TRUE;
+  if ((input_sec->flags & SEC_EXCLUDE) != 0)
     return TRUE;
 
   /* Output a FILE symbol so that following locals are not associated
@@ -9455,8 +9464,9 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
 
       *ppsection = isec;
 
-      /* Don't output the first, undefined, symbol.  */
-      if (ppsection == flinfo->sections)
+      /* Don't output the first, undefined, symbol.  In fact, don't
+	 output any undefined local symbol.  */
+      if (isec == bfd_und_section_ptr)
 	continue;
 
       if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 64f0871..7619bc5 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2015-02-19  Alan Modra  <amodra@gmail.com>
+
+	PR ld/4317
+	* ld-aarch64/gc-tls-relocs.d, * ld-cris/locref2.d,
+	* ld-elf/ehdr_start-weak.d, * ld-elf/group1.d,
+	* ld-i386/compressed1.d, * ld-ia64/error1.d, * ld-ia64/error2.d,
+	* ld-ia64/error3.d, * ld-mips-elf/pic-and-nonpic-1.nd,
+	* ld-mmix/undef-3.d, * ld-powerpc/tlsexe.r, * ld-powerpc/tlsexetoc.r,
+	* ld-powerpc/tlsso.r, * ld-powerpc/tlstocso.r,
+	* ld-x86-64/compressed1.d, * ld-x86-64/pie1.d: Update.
+
 2015-02-17  Alan Modra  <amodra@gmail.com>
 
 	PR ld/17975
diff --git a/ld/testsuite/ld-aarch64/gc-tls-relocs.d b/ld/testsuite/ld-aarch64/gc-tls-relocs.d
index 191647c..480d869 100644
--- a/ld/testsuite/ld-aarch64/gc-tls-relocs.d
+++ b/ld/testsuite/ld-aarch64/gc-tls-relocs.d
@@ -17,7 +17,6 @@ SYMBOL TABLE:
 0+9000 l    d  \.got	0+ \.got
 0+0000 l    df \*ABS\*	0+ .*
 0+0000 l    df \*ABS\*	0+ 
-0+0000 l       \*UND\*	0+ __tls_get_addr
 0+9000 l     O \.got	0+ _GLOBAL_OFFSET_TABLE_
 0+8000 g       \.text	0+ _start
 
diff --git a/ld/testsuite/ld-cris/locref2.d b/ld/testsuite/ld-cris/locref2.d
index 735b10e..0cf5394 100644
--- a/ld/testsuite/ld-cris/locref2.d
+++ b/ld/testsuite/ld-cris/locref2.d
@@ -12,8 +12,6 @@
 SYMBOL TABLE:
 #...
 0+82088 l     O \.got	0+ _GLOBAL_OFFSET_TABLE_
-0+  w      \*UND\*	0+ expfn
-0+  w      \*UND\*	0+ expobj
 #...
 Disassembly of section \.text:
 #...
diff --git a/ld/testsuite/ld-elf/ehdr_start-weak.d b/ld/testsuite/ld-elf/ehdr_start-weak.d
index 24ae34c..5644d05 100644
--- a/ld/testsuite/ld-elf/ehdr_start-weak.d
+++ b/ld/testsuite/ld-elf/ehdr_start-weak.d
@@ -4,6 +4,7 @@
 #target: *-*-linux* *-*-gnu* *-*-nacl*
 #xfail: frv-*-*
 
+#failif
+#...
+.* __ehdr_start
 #...
-\s+[wU] __ehdr_start
-#pass
diff --git a/ld/testsuite/ld-elf/group1.d b/ld/testsuite/ld-elf/group1.d
index ff67535..257be11 100644
--- a/ld/testsuite/ld-elf/group1.d
+++ b/ld/testsuite/ld-elf/group1.d
@@ -8,5 +8,3 @@
 Symbol table '.symtab' contains .* entries:
 #...
 .*: 0+1000 +0 +(NOTYPE|OBJECT) +WEAK +DEFAULT +. foo
-.*: 0+0000 +0 +(NOTYPE|OBJECT) +GLOBAL +DEFAULT +UND bar
-#...
diff --git a/ld/testsuite/ld-i386/compressed1.d b/ld/testsuite/ld-i386/compressed1.d
index 3a57c81..c17d3c7 100644
--- a/ld/testsuite/ld-i386/compressed1.d
+++ b/ld/testsuite/ld-i386/compressed1.d
@@ -2,8 +2,3 @@
 #as: --32
 #ld: -e foo -melf_i386 --noinhibit-exec
 #warning: .*/compressed1.c:13: undefined reference to .bar.
-#nm: -n
-
-#...
-[ \t]+U bar
-#pass
diff --git a/ld/testsuite/ld-ia64/error1.d b/ld/testsuite/ld-ia64/error1.d
index 82142b6..7b2476f 100644
--- a/ld/testsuite/ld-ia64/error1.d
+++ b/ld/testsuite/ld-ia64/error1.d
@@ -2,6 +2,4 @@
 #ld: -unresolved-symbols=ignore-all
 #readelf: -s
 
-#...
-[ 	]+[0-9]+:[ 	]+[0]+[ 	]+0[ 	]+NOTYPE[ 	]+GLOBAL DEFAULT[ 	]+UND[ 	]+foo
 #pass
diff --git a/ld/testsuite/ld-ia64/error2.d b/ld/testsuite/ld-ia64/error2.d
index 764ba66..ae74eaa 100644
--- a/ld/testsuite/ld-ia64/error2.d
+++ b/ld/testsuite/ld-ia64/error2.d
@@ -2,6 +2,4 @@
 #ld: -pie -unresolved-symbols=ignore-all
 #readelf: -s
 
-#...
-[ 	]+[0-9]+:[ 	]+[0]+[ 	]+0[ 	]+NOTYPE[ 	]+GLOBAL DEFAULT[ 	]+UND[ 	]+foo
 #pass
diff --git a/ld/testsuite/ld-ia64/error3.d b/ld/testsuite/ld-ia64/error3.d
index e14d451..256a6fd 100644
--- a/ld/testsuite/ld-ia64/error3.d
+++ b/ld/testsuite/ld-ia64/error3.d
@@ -2,6 +2,4 @@
 #ld: -pie -shared
 #readelf: -s
 
-#...
-[ 	]+[0-9]+:[ 	]+[0]+[ 	]+0[ 	]+NOTYPE[ 	]+GLOBAL DEFAULT[ 	]+UND[ 	]+foo
 #pass
diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-1.nd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-1.nd
index 78a1c60..3c449fb 100644
--- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-1.nd
+++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-1.nd
@@ -2,7 +2,6 @@
 .*: 00068000 +0 +NOTYPE +LOCAL +DEFAULT +ABS _gp
 .*: 00041018 +8 +FUNC +LOCAL +DEFAULT .* .pic.f1
 .*: 00041000 +16 +FUNC +LOCAL +DEFAULT .* .pic.f2
-.*: 00000000 +0 +OBJECT +GLOBAL +DEFAULT +UND _gp_disp
 .*: 00041050 +14 +FUNC +GLOBAL +DEFAULT +\[MIPS16\] .* f3
 .*: 00041060 +24 +FUNC +GLOBAL +DEFAULT .* __start
 .*: 0004103c +20 +FUNC +GLOBAL +DEFAULT .* f2
diff --git a/ld/testsuite/ld-mmix/undef-3.d b/ld/testsuite/ld-mmix/undef-3.d
index 2f551b9..8fbf304 100644
--- a/ld/testsuite/ld-mmix/undef-3.d
+++ b/ld/testsuite/ld-mmix/undef-3.d
@@ -14,19 +14,18 @@ Section Headers:
  +\[ 2\] \.shstrtab +STRTAB +0+ +0+7c
  +0+21 +0+ +0 +0 +1
  +\[ 3\] \.symtab +SYMTAB +0+ .*
- +0+c0 +0+18 +4 +2 +8
+ +0+a8 +0+18 +4 +2 +8
  +\[ 4\] \.strtab +STRTAB +0+ .*
- +0+2f +0+ +0 +0 +1
+ +0+28 +0+ +0 +0 +1
 Key to Flags:
 #...
 
-Symbol table '\.symtab' contains 8 entries:
+Symbol table '\.symtab' contains 7 entries:
  +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
  +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND 
  +1: 0+ +0 +SECTION +LOCAL +DEFAULT +1 
- +2: 0+ +0 +NOTYPE +GLOBAL +DEFAULT +UND undefd
- +3: 0+ +0 +NOTYPE +GLOBAL +DEFAULT +1 _start
- +4: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 __bss_start
- +5: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 _edata
- +6: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 _end
- +7: 0+ +0 +NOTYPE +GLOBAL +DEFAULT +1 _start\.
+ +2: 0+ +0 +NOTYPE +GLOBAL +DEFAULT +1 _start
+ +3: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 __bss_start
+ +4: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 _edata
+ +5: 2000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 _end
+ +6: 0+ +0 +NOTYPE +GLOBAL +DEFAULT +1 _start\.
diff --git a/ld/testsuite/ld-powerpc/tlsexe.r b/ld/testsuite/ld-powerpc/tlsexe.r
index 443bae8..94e5272 100644
--- a/ld/testsuite/ld-powerpc/tlsexe.r
+++ b/ld/testsuite/ld-powerpc/tlsexe.r
@@ -98,9 +98,8 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* TLS +LOCAL +DEFAULT +8 le5
 .* FILE +LOCAL +DEFAULT +ABS 
 .* OBJECT +LOCAL +DEFAULT +10 _DYNAMIC
-.* (NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve|(FUNC|NOTYPE) +LOCAL +DEFAULT +UND \.__tls_get_addr(|_opt))
-.* (NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt)|NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve)
-.* ((FUNC|NOTYPE) +LOCAL +DEFAULT +UND \.__tls_get_addr(|_opt)|NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt))
+.* NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve
+.* NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt)
 .* GLOBAL +DEFAULT +UND gd
 .* GLOBAL +DEFAULT +9 le0
 .* GLOBAL +DEFAULT +9 ld0
diff --git a/ld/testsuite/ld-powerpc/tlsexetoc.r b/ld/testsuite/ld-powerpc/tlsexetoc.r
index bb6462f..7b55281 100644
--- a/ld/testsuite/ld-powerpc/tlsexetoc.r
+++ b/ld/testsuite/ld-powerpc/tlsexetoc.r
@@ -98,9 +98,8 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* NOTYPE +LOCAL +DEFAULT +12 \.Lie0
 .* FILE +LOCAL +DEFAULT +ABS 
 .* OBJECT +LOCAL +DEFAULT +10 _DYNAMIC
-.* (NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve|(FUNC|NOTYPE) +LOCAL +DEFAULT +UND \.__tls_get_addr(|_opt))
-.* (NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt)|NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve)
-.* ((FUNC|NOTYPE) +LOCAL +DEFAULT +UND \.__tls_get_addr(|_opt)|NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt))
+.* NOTYPE +LOCAL +DEFAULT +7 __glink_PLTresolve
+.* NOTYPE +LOCAL +DEFAULT +7 .*\.plt_call\.__tls_get_addr(|_opt)
 .* TLS +GLOBAL +DEFAULT +UND gd
 .* TLS +GLOBAL +DEFAULT +9 le0
 .* TLS +GLOBAL +DEFAULT +9 ld0
diff --git a/ld/testsuite/ld-powerpc/tlsso.r b/ld/testsuite/ld-powerpc/tlsso.r
index 3a5b808..e0a3a75 100644
--- a/ld/testsuite/ld-powerpc/tlsso.r
+++ b/ld/testsuite/ld-powerpc/tlsso.r
@@ -116,7 +116,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* OBJECT +LOCAL +DEFAULT +9 _DYNAMIC
 .* NOTYPE +LOCAL +DEFAULT +6 .*\.plt_call\.__tls_get_addr
 .* NOTYPE +LOCAL +DEFAULT +6 __glink_PLTresolve
-.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
 .* TLS +GLOBAL +DEFAULT +UND gd
 .* TLS +GLOBAL +DEFAULT +8 le0
 .* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
diff --git a/ld/testsuite/ld-powerpc/tlstocso.r b/ld/testsuite/ld-powerpc/tlstocso.r
index 075e303..0006db9 100644
--- a/ld/testsuite/ld-powerpc/tlstocso.r
+++ b/ld/testsuite/ld-powerpc/tlstocso.r
@@ -112,7 +112,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* OBJECT +LOCAL +DEFAULT +9 _DYNAMIC
 .* NOTYPE +LOCAL +DEFAULT +6 .*\.plt_call\.__tls_get_addr
 .* NOTYPE +LOCAL +DEFAULT +6 __glink_PLTresolve
-.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
 .* TLS +GLOBAL +DEFAULT +UND gd
 .* TLS +GLOBAL +DEFAULT +8 le0
 .* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
diff --git a/ld/testsuite/ld-x86-64/compressed1.d b/ld/testsuite/ld-x86-64/compressed1.d
index 1dd0f4c..9e9d92c 100644
--- a/ld/testsuite/ld-x86-64/compressed1.d
+++ b/ld/testsuite/ld-x86-64/compressed1.d
@@ -2,8 +2,3 @@
 #as: --64
 #ld: -e foo -melf_x86_64 --noinhibit-exec
 #warning: .*/compressed1.c:13: undefined reference to .bar.
-#nm: -n
-
-#...
-[ \t]+U bar
-#pass
diff --git a/ld/testsuite/ld-x86-64/pie1.d b/ld/testsuite/ld-x86-64/pie1.d
index 06d2562..368d153 100644
--- a/ld/testsuite/ld-x86-64/pie1.d
+++ b/ld/testsuite/ld-x86-64/pie1.d
@@ -1,9 +1,4 @@
 #name: PIE with undefined symbol
 #as: --64
 #ld: -pie -melf_x86_64 --noinhibit-exec
-#readelf: -s --wide
 #warning: \A[^\n]*\.o[^\n]*In function `_start':\n[^\n]*: undefined reference to `foo'\Z
-
-#...
- +[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +UND foo
-#pass

-- 
Alan Modra
Australia Development Lab, IBM


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