diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-06 10:43:53 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-06 13:11:22 +1030 |
commit | 889d15d574a8c43c44dc0983343897e47874a2b6 (patch) | |
tree | cffdb89b1462d6b4272553da1b00d64da2860103 | |
parent | d845ea8cd3daf11ddef16501f322875874295027 (diff) | |
download | gdb-889d15d574a8c43c44dc0983343897e47874a2b6.zip gdb-889d15d574a8c43c44dc0983343897e47874a2b6.tar.gz gdb-889d15d574a8c43c44dc0983343897e47874a2b6.tar.bz2 |
PR30198, Assertion and segfault when linking x86_64 elf and coff
PR 30198
* coff-x86_64.c (coff_amd64_reloc): Set *error_message when
returning bfd_reloc_dangerous. Also check that __ImageBase is
defined before accessing h->u.def.
-rw-r--r-- | bfd/coff-x86_64.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/bfd/coff-x86_64.c b/bfd/coff-x86_64.c index 13061cd..822504a 100644 --- a/bfd/coff-x86_64.c +++ b/bfd/coff-x86_64.c @@ -139,15 +139,19 @@ coff_amd64_reloc (bfd *abfd, break; case bfd_target_elf_flavour: /* Subtract __ImageBase. */ + h = NULL; link_info = _bfd_get_link_info (obfd); - if (link_info == NULL) - return bfd_reloc_dangerous; - h = bfd_link_hash_lookup (link_info->hash, "__ImageBase", - false, false, false); - if (h == NULL) - return bfd_reloc_dangerous; - while (h->type == bfd_link_hash_indirect) - h = h->u.i.link; + if (link_info != NULL) + h = bfd_link_hash_lookup (link_info->hash, "__ImageBase", + false, false, true); + if (h == NULL + || (h->type != bfd_link_hash_defined + && h->type != bfd_link_hash_defweak)) + { + *error_message + = (char *) _("R_AMD64_IMAGEBASE with __ImageBase undefined"); + return bfd_reloc_dangerous; + } /* ELF symbols in relocatable files are section relative, but in nonrelocatable files they are virtual addresses. */ diff -= (h->u.def.value |