From: Alan Modra Date: Sun, 12 Nov 2017 03:42:41 +0000 (+1030) Subject: weakdef list handling X-Git-Tag: users/ARM/embedded-binutils-master-2017q4~258 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e3e53eed9c2f1ab82ae4a7683f474b4f6eb162c7;p=external%2Fbinutils.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 735136d..989149a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 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 to keep dyn_relocs, clear to discard. Comment. (allocate_dynrelocs): Always clear non_got_ref when clearing diff --git a/bfd/elflink.c b/bfd/elflink.c index 122549c..72886d5 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;