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] Hide dynamic symbols in discarded sections


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

commit af0bfb9c4283ce80fe37ad6360d12cae8ec38696
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Jul 3 12:18:10 2018 +0930

    Hide dynamic symbols in discarded sections
    
    This is a followup to git commit 97196564c7 "Strip global symbol
    defined in discarded section".  If a symbol defined in a discarded
    section was dynamic, that patch left .dynsym with holes (ie. all zero
    entries).  For example, the following from libstdc++.so:
    
    Symbol table '.dynsym' contains 6090 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
         1: 00000000000a74e0     0 SECTION LOCAL  DEFAULT   10
         2: 0000000000264180     0 SECTION LOCAL  DEFAULT   17
         3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_addUserCommitAction
         4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_memcpyRtWn
         5: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
    readelf: Warning: local symbol 5 found at index >= .dynsym's sh_info value of 3
         6: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
    readelf: Warning: local symbol 6 found at index >= .dynsym's sh_info value of 3
    [snip]
    
    This patch removes the symbols from .dynsym too.
    
    	PR 17550
    	* elflink.c (_bfd_elf_fix_symbol_flags): Hide dynamic symbols
    	in discarded sections.

Diff:
---
 bfd/ChangeLog | 6 ++++++
 bfd/elflink.c | 8 ++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index bfe2aa2..8ed9765 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-03  Alan Modra  <amodra@gmail.com>
+
+	PR 17550
+	* elflink.c (_bfd_elf_fix_symbol_flags): Hide dynamic symbols
+	in discarded sections.
+
 2018-07-02  Maciej W. Rozycki  <macro@mips.com>
 
 	* elfxx-mips.c (_bfd_mips_elf_create_dynamic_sections): Set
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 36e0c37..e5592b0 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -2853,10 +2853,14 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
       && (h->root.u.def.section->owner->flags & (DYNAMIC | BFD_PLUGIN)) == 0)
     h->def_regular = 1;
 
+  /* Symbols defined in discarded sections shouldn't be dynamic.  */
+  if (h->root.type == bfd_link_hash_undefined && h->indx == -3)
+    (*bed->elf_backend_hide_symbol) (eif->info, h, TRUE);
+
   /* If a weak undefined symbol has non-default visibility, we also
      hide it from the dynamic linker.  */
-  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
-      && h->root.type == bfd_link_hash_undefweak)
+  else if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	   && h->root.type == bfd_link_hash_undefweak)
     (*bed->elf_backend_hide_symbol) (eif->info, h, TRUE);
 
   /* A hidden versioned symbol in executable should be forced local if


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