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.
This commit is contained in:
Alan Modra 2017-11-12 14:12:41 +10:30
parent 529fe20eeb
commit e3e53eed9c
2 changed files with 9 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2017-11-12 Alan Modra <amodra@gmail.com>
* elflink.c (elf_link_add_object_symbols): Ignore anything but
defined and defweak symbols when setting up weakdefs.
2017-11-12 Alan Modra <amodra@gmail.com>
* elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Set non_got_ref

View File

@ -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;