From b75d42bce5609effad86fb8b5d902f4c337e0cf9 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 16 Jan 2014 11:50:28 +1030 Subject: [PATCH] Fix mips segfault on GOT access of absolute symbol When a symbol is absolute, this code in mips_elf_record_got_page_entry entry = bfd_zalloc (sec->owner, sizeof (*entry)); segfaults. sec == bfd_abs_section_ptr and sec->owner == NULL. * elfxx-mips.c (mips_elf_record_got_page_entry): Pass in a mips_elf_traverse_got_arg* rather than mips_got_info*. Adjust caller. Alloc on output_bfd rather than symbol section owner. --- bfd/ChangeLog | 7 +++++++ bfd/elfxx-mips.c | 9 +++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0bf76654e1b..6e1e334189b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2014-01-16 Alan Modra + + * elfxx-mips.c (mips_elf_record_got_page_entry): Pass in a + mips_elf_traverse_got_arg* rather than mips_got_info*. + Adjust caller. Alloc on output_bfd rather than symbol section + owner. + 2014-01-15 H.J. Lu * elf32-i386.c (elf_i386_allocate_dynrelocs): Revert the last diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index d5f51a3b716..f51845b7b5e 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -4089,9 +4089,10 @@ mips_elf_pages_for_range (const struct mips_got_page_range *range) /* Record that G requires a page entry that can reach SEC + ADDEND. */ static bfd_boolean -mips_elf_record_got_page_entry (struct mips_got_info *g, +mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg, asection *sec, bfd_signed_vma addend) { + struct mips_got_info *g = arg->g; struct mips_got_page_entry lookup, *entry; struct mips_got_page_range **range_ptr, *range; bfd_vma old_pages, new_pages; @@ -4108,7 +4109,7 @@ mips_elf_record_got_page_entry (struct mips_got_info *g, entry = (struct mips_got_page_entry *) *loc; if (!entry) { - entry = bfd_zalloc (sec->owner, sizeof (*entry)); + entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry)); if (!entry) return FALSE; @@ -4128,7 +4129,7 @@ mips_elf_record_got_page_entry (struct mips_got_info *g, range = *range_ptr; if (!range || addend < range->min_addend - 0xffff) { - range = bfd_zalloc (sec->owner, sizeof (*range)); + range = bfd_zalloc (arg->info->output_bfd, sizeof (*range)); if (!range) return FALSE; @@ -4248,7 +4249,7 @@ mips_elf_resolve_got_page_ref (void **refp, void *data) else addend = isym->st_value + ref->addend; } - if (!mips_elf_record_got_page_entry (arg->g, sec, addend)) + if (!mips_elf_record_got_page_entry (arg, sec, addend)) { arg->g = NULL; return 0; -- 2.30.2