From af0bfb9c4283ce80fe37ad6360d12cae8ec38696 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 3 Jul 2018 12:18:10 +0930 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/elflink.c | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index bfe2aa293c3..8ed97651009 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-07-03 Alan Modra + + PR 17550 + * elflink.c (_bfd_elf_fix_symbol_flags): Hide dynamic symbols + in discarded sections. + 2018-07-02 Maciej W. Rozycki * elfxx-mips.c (_bfd_mips_elf_create_dynamic_sections): Set diff --git a/bfd/elflink.c b/bfd/elflink.c index 36e0c37c8ef..e5592b023ac 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 -- 2.30.2