From e3e53eed9c2f1ab82ae4a7683f474b4f6eb162c7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 12 Nov 2017 14:12:41 +1030 Subject: [PATCH] weakdef list handling The existing code allowed common and indirect symbols to pass an assert, but then read root.u.def which is not valid for anything besides defined and weakdef symbols. The garbage root.u.def.section pointer read can't possibly match pointers stored at the same location for indirect and common symbols, so we would always have left u.weakdef NULL. * elflink.c (elf_link_add_object_symbols): Ignore anything but defined and defweak symbols when setting up weakdefs. --- bfd/ChangeLog | 5 +++++ bfd/elflink.c | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 735136d7f8..989149a497 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-11-12 Alan Modra + + * elflink.c (elf_link_add_object_symbols): Ignore anything but + defined and defweak symbols when setting up weakdefs. + 2017-11-12 Alan Modra * elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Set non_got_ref diff --git a/bfd/elflink.c b/bfd/elflink.c index 122549c594..72886d57e5 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5145,10 +5145,10 @@ error_free_dyn: weaks = hlook->u.weakdef; hlook->u.weakdef = NULL; - BFD_ASSERT (hlook->root.type == bfd_link_hash_defined - || hlook->root.type == bfd_link_hash_defweak - || hlook->root.type == bfd_link_hash_common - || hlook->root.type == bfd_link_hash_indirect); + if (hlook->root.type != bfd_link_hash_defined + && hlook->root.type != bfd_link_hash_defweak) + continue; + slook = hlook->root.u.def.section; vlook = hlook->root.u.def.value; -- 2.34.1