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.
This commit is contained in:
parent
586338b839
commit
c83004d526
|
@ -1,3 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/* Get GOT offset for this symbol. */
|
||||
elf_m68k_init_got_entry_key (&key_, h, input_bfd, r_symndx,
|
||||
|
|
Loading…
Reference in New Issue