diff options
author | Alan Modra <amodra@gmail.com> | 2019-11-21 08:57:00 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-11-21 21:08:30 +1030 |
commit | 73d5efd7e13ebd8fe87278224bc2ae777af3de52 (patch) | |
tree | 604140a0d4b12517d74f7c9463ff1c34ed1ede52 /bfd/elf32-arm.c | |
parent | 65d1cd5f9cbcbb2df0b187cb7623949c1668728f (diff) | |
download | fsf-binutils-gdb-73d5efd7e13ebd8fe87278224bc2ae777af3de52.zip fsf-binutils-gdb-73d5efd7e13ebd8fe87278224bc2ae777af3de52.tar.gz fsf-binutils-gdb-73d5efd7e13ebd8fe87278224bc2ae777af3de52.tar.bz2 |
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.
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r-- | bfd/elf32-arm.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index f27ee42..dca208f 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -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; |