aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-04-11 23:34:21 +0930
committerAlan Modra <amodra@gmail.com>2021-04-12 11:57:03 +0930
commitfc304b889106f6d1bd720e969b95615992bf1961 (patch)
treeaf9f6df2ab9282409587e4b8ba784e813e2c6f5c /ld/emultempl
parente601909a3287bf541c6a7d82214bb387d2c76d82 (diff)
downloadgdb-fc304b889106f6d1bd720e969b95615992bf1961.zip
gdb-fc304b889106f6d1bd720e969b95615992bf1961.tar.gz
gdb-fc304b889106f6d1bd720e969b95615992bf1961.tar.bz2
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.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/armelf.em2
-rw-r--r--ld/emultempl/solaris2.em3
2 files changed, 3 insertions, 2 deletions
diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
index bcb60d2..7aec17e 100644
--- a/ld/emultempl/armelf.em
+++ b/ld/emultempl/armelf.em
@@ -463,7 +463,7 @@ gld${EMULATION_NAME}_finish (void)
{
struct elf_link_hash_entry * eh;
- if (!entry_symbol.name)
+ if (!entry_symbol.name || !is_elf_hash_table (link_info.hash))
return;
h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
diff --git a/ld/emultempl/solaris2.em b/ld/emultempl/solaris2.em
index 9fb739c..e2b4fd63b 100644
--- a/ld/emultempl/solaris2.em
+++ b/ld/emultempl/solaris2.em
@@ -64,7 +64,8 @@ elf_solaris2_before_allocation (void)
const char **sym;
/* Do this for both executables and shared objects. */
- if (!bfd_link_relocatable (&link_info))
+ if (!bfd_link_relocatable (&link_info)
+ && is_elf_hash_table (link_info.hash))
{
for (sym = global_syms; *sym != NULL; sym++)
{