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.
This commit is contained in:
parent
ab7f45ba10
commit
b75d42bce5
2 changed files with 12 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2014-01-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* 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 <hongjiu.lu@intel.com>
|
2014-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf32-i386.c (elf_i386_allocate_dynrelocs): Revert the last
|
* elf32-i386.c (elf_i386_allocate_dynrelocs): Revert the last
|
||||||
|
|
|
@ -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. */
|
/* Record that G requires a page entry that can reach SEC + ADDEND. */
|
||||||
|
|
||||||
static bfd_boolean
|
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)
|
asection *sec, bfd_signed_vma addend)
|
||||||
{
|
{
|
||||||
|
struct mips_got_info *g = arg->g;
|
||||||
struct mips_got_page_entry lookup, *entry;
|
struct mips_got_page_entry lookup, *entry;
|
||||||
struct mips_got_page_range **range_ptr, *range;
|
struct mips_got_page_range **range_ptr, *range;
|
||||||
bfd_vma old_pages, new_pages;
|
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;
|
entry = (struct mips_got_page_entry *) *loc;
|
||||||
if (!entry)
|
if (!entry)
|
||||||
{
|
{
|
||||||
entry = bfd_zalloc (sec->owner, sizeof (*entry));
|
entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -4128,7 +4129,7 @@ mips_elf_record_got_page_entry (struct mips_got_info *g,
|
||||||
range = *range_ptr;
|
range = *range_ptr;
|
||||||
if (!range || addend < range->min_addend - 0xffff)
|
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)
|
if (!range)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -4248,7 +4249,7 @@ mips_elf_resolve_got_page_ref (void **refp, void *data)
|
||||||
else
|
else
|
||||||
addend = isym->st_value + ref->addend;
|
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;
|
arg->g = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue