aboutsummaryrefslogtreecommitdiff
path: root/bfd
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
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')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-m68k.c35
2 files changed, 31 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 72da0df..fd0dfcb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,14 @@
2019-05-28 Alan Modra <amodra@gmail.com>
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.
+
+2019-05-28 Alan Modra <amodra@gmail.com>
+
+ PR 24596
* elf64-hppa.c (elf64_hppa_finalize_dynreloc): Get the output bfd
from bfd_link_info, not an output section owner.
(elf64_hppa_finish_dynamic_symbol, elf64_hppa_finalize_opd): Likewise.
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,