Hide dynamic symbols in discarded sections
authorAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2018 02:48:10 +0000 (12:18 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2018 03:01:34 +0000 (12:31 +0930)
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.

bfd/ChangeLog
bfd/elflink.c

index bfe2aa293c3aa09dc5096e862a6d6987809ce5ab..8ed97651009548b88415e772ef53a718aa5abac6 100644 (file)
@@ -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
index 36e0c37c8ef2799767ffad5fdae2152feea9c8a6..e5592b023ac8e25d7777dc2a3a336c103cec31fd 100644 (file)
@@ -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