From fc304b889106f6d1bd720e969b95615992bf1961 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 11 Apr 2021 23:34:21 +0930 Subject: PR27719, lang_mark_undefineds trashes memory It's not enough to test that the output is ELF before casting bfd_link_hash_entry to elf_link_hash_entry. Some ELF targets (d30v, dlx, pj, s12z, xgate) use the generic linker support in bfd/linker.c and thus their symbols are of type generic_link_hash_entry. Not all of the places this patch touches can result in wrong accesses, but I thought it worth ensuring that all occurrences of elf_link_hash_entry in ld/ were obviously correct. PR 27719 * ldlang.c (lang_mark_undefineds, undef_start_stop): Test that the symbol hash table is the correct type before accessing elf_link_hash_entry symbols. * plugin.c (is_visible_from_outside): Likewise. * emultempl/armelf.em (ld${EMULATION_NAME}_finish): Likewise. * emultempl/solaris2.em (elf_solaris2_before_allocation): Likewise. --- ld/plugin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ld/plugin.c') diff --git a/ld/plugin.c b/ld/plugin.c index adaba32..98a83bc 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -636,7 +636,7 @@ is_visible_from_outside (struct ld_plugin_symbol *lsym, blhe->root.string)) return false; /* Only ELF symbols really have visibility. */ - if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour) + if (is_elf_hash_table (link_info.hash)) { struct elf_link_hash_entry *el = (struct elf_link_hash_entry *)blhe; int vis = ELF_ST_VISIBILITY (el->other); -- cgit v1.1