aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-m68k.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-05-28 11:49:30 +0930
committerAlan Modra <amodra@gmail.com>2019-05-28 14:38:08 +0930
commitc83004d526c9f5e203926a979d405f7b720b9ede (patch)
treef96259309cf3e9126aab52eb09c60f1d222280f7 /bfd/elf32-m68k.c
parent586338b839d3f65d22eb3baef41f7395974f1f11 (diff)
downloadgdb-c83004d526c9f5e203926a979d405f7b720b9ede.zip
gdb-c83004d526c9f5e203926a979d405f7b720b9ede.tar.gz
gdb-c83004d526c9f5e203926a979d405f7b720b9ede.tar.bz2
m68k linker segmentation faults
This doesn't fix the underlying bug, but an abort is better than a segfault. PR 24596 * elf32-m68k.c (elf_m68k_get_got_entry): Don't create a new entry when MUST_FIND. Abort when MUST_FIND not found. (elf_m68k_get_bfd2got_entry): Likewise. (elf_m68k_relocate_section): Remove now useless assert.
Diffstat (limited to 'bfd/elf32-m68k.c')
-rw-r--r--bfd/elf32-m68k.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
index e8d9ed5..4efac79 100644
--- a/bfd/elf32-m68k.c
+++ b/bfd/elf32-m68k.c
@@ -1519,14 +1519,18 @@ elf_m68k_get_got_entry (struct elf_m68k_got *got,
}
entry_.key_ = *key;
- ptr = htab_find_slot (got->entries, &entry_, (howto != SEARCH
- ? INSERT : NO_INSERT));
+ ptr = htab_find_slot (got->entries, &entry_,
+ (howto == SEARCH || howto == MUST_FIND ? NO_INSERT
+ : INSERT));
if (ptr == NULL)
{
if (howto == SEARCH)
/* Entry not found. */
return NULL;
+ if (howto == MUST_FIND)
+ abort ();
+
/* We're out of memory. */
bfd_set_error (bfd_error_no_memory);
return NULL;
@@ -1535,7 +1539,10 @@ elf_m68k_get_got_entry (struct elf_m68k_got *got,
if (*ptr == NULL)
/* We didn't find the entry and we're asked to create a new one. */
{
- BFD_ASSERT (howto != MUST_FIND && howto != SEARCH);
+ if (howto == MUST_FIND)
+ abort ();
+
+ BFD_ASSERT (howto != SEARCH);
entry = bfd_alloc (elf_hash_table (info)->dynobj, sizeof (*entry));
if (entry == NULL)
@@ -1750,14 +1757,18 @@ elf_m68k_get_bfd2got_entry (struct elf_m68k_multi_got *multi_got,
}
entry_.bfd = abfd;
- ptr = htab_find_slot (multi_got->bfd2got, &entry_, (howto != SEARCH
- ? INSERT : NO_INSERT));
+ ptr = htab_find_slot (multi_got->bfd2got, &entry_,
+ (howto == SEARCH || howto == MUST_FIND ? NO_INSERT
+ : INSERT));
if (ptr == NULL)
{
if (howto == SEARCH)
/* Entry not found. */
return NULL;
+ if (howto == MUST_FIND)
+ abort ();
+
/* We're out of memory. */
bfd_set_error (bfd_error_no_memory);
return NULL;
@@ -1766,7 +1777,10 @@ elf_m68k_get_bfd2got_entry (struct elf_m68k_multi_got *multi_got,
if (*ptr == NULL)
/* Entry was not found. Create new one. */
{
- BFD_ASSERT (howto != MUST_FIND && howto != SEARCH);
+ if (howto == MUST_FIND)
+ abort ();
+
+ BFD_ASSERT (howto != SEARCH);
entry = ((struct elf_m68k_bfd2got_entry *)
bfd_alloc (elf_hash_table (info)->dynobj, sizeof (*entry)));
@@ -3562,12 +3576,9 @@ elf_m68k_relocate_section (bfd *output_bfd,
BFD_ASSERT (sgot != NULL);
if (got == NULL)
- {
- got = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
- input_bfd, MUST_FIND,
- NULL)->got;
- BFD_ASSERT (got != NULL);
- }
+ got = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
+ input_bfd, MUST_FIND,
+ NULL)->got;
/* Get GOT offset for this symbol. */
elf_m68k_init_got_entry_key (&key_, h, input_bfd, r_symndx,