From 73d5efd7e13ebd8fe87278224bc2ae777af3de52 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 21 Nov 2019 08:57:00 +1030 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf32-arm.c | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ffe527c52a3..a1ef734af6a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2019-11-21 Alan Modra + + * elf32-arm.c (elf32_arm_size_stubs): Exclude dynamic library + BFDs that have not been loaded. + 2019-11-19 Alan Modra PR 25197 diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index f27ee421833..dca208f06aa 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; -- 2.30.2