--- binutils.orig/bfd/elflink.c 2020-02-18 17:32:29.506802884 +0000 +++ binutils-2.32/bfd/elflink.c 2020-02-18 17:34:09.783017828 +0000 @@ -12988,6 +12988,7 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_i { unsigned long r_symndx; struct elf_link_hash_entry *h; + struct elf_link_hash_entry *hw; r_symndx = cookie->rel->r_info >> cookie->r_sym_shift; if (r_symndx == STN_UNDEF) @@ -13007,12 +13008,16 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_i || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; h->mark = 1; - /* If this symbol is weak and there is a non-weak definition, we - keep the non-weak definition because many backends put - dynamic reloc info on the non-weak definition for code - handling copy relocs. */ - if (h->is_weakalias) - weakdef (h)->mark = 1; + /* Keep all aliases of the symbol too. If an object symbol + needs to be copied into .dynbss then all of its aliases + should be present as dynamic symbols, not just the one used + on the copy relocation. */ + hw = h; + while (hw->is_weakalias) + { + hw = hw->u.alias; + hw->mark = 1; + } if (start_stop != NULL) {