ARM cmse_scan segfault

This code in elf_link_add_object_symbols:

      ret = elf_add_dt_needed_tag (abfd, info, soname, add_needed);
      if (ret < 0)
	goto error_return;

      /* If we have already included this dynamic object in the
	 link, just ignore it.  There is no reason to include a
	 particular dynamic object more than once.  */
      if (ret > 0)
	return TRUE;

prevents a shared library from being loaded twice by ensuring that any
library soname doesn't match the soname of one already loaded.  This
happens before sym_hashes are allocated, which leaves sym_hashes NULL.

cmse_scan looks at library symbols, and when attempting to look up a
global symbol will segfault if sym_hashes is zero.

	* elf32-arm.c (elf32_arm_size_stubs): Exclude dynamic library
	BFDs that have not been loaded.
This commit is contained in:
Alan Modra 2019-11-21 08:57:00 +10:30
parent 65d1cd5f9c
commit 73d5efd7e1
2 changed files with 10 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2019-11-21 Alan Modra <amodra@gmail.com>
* elf32-arm.c (elf32_arm_size_stubs): Exclude dynamic library
BFDs that have not been loaded.
2019-11-19 Alan Modra <amodra@gmail.com>
PR 25197

View File

@ -6527,8 +6527,11 @@ elf32_arm_size_stubs (bfd *output_bfd,
asection *section;
Elf_Internal_Sym *local_syms = NULL;
if (!is_arm_elf (input_bfd)
|| (elf_dyn_lib_class (input_bfd) & DYN_AS_NEEDED) != 0)
if (!is_arm_elf (input_bfd))
continue;
if ((input_bfd->flags & DYNAMIC) != 0
&& (elf_sym_hashes (input_bfd) == NULL
|| (elf_dyn_lib_class (input_bfd) & DYN_AS_NEEDED) != 0))
continue;
num_a8_relocs = 0;