mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-18 14:53:32 +08:00
PR22431, powerpc64 ld segfault when .plt discarded
The fix for the PR is to not use input_section->output_section->owner to get to the output bfd, but use the output bfd directly since it is available nowadays in struct bfd_link_info. I thought it worth warning when non-empty dynamic sections are discarded too, which meant a tweak to one of the ld tests to avoid the warning. bfd/ PR 22431 * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Warn on discarding non-empty dynamic section. (ppc_build_one_stub): Take elf_gp from output bfd, not output section owner. (ppc_size_one_stub, ppc64_elf_next_toc_section): Likewise. ld/ * testsuite/ld-elf/note-3.t: Don't discard .got.
This commit is contained in:
parent
640d0ed874
commit
06bcf5416f
@ -1,3 +1,12 @@
|
||||
2017-11-14 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR 22431
|
||||
* elf64-ppc.c (ppc64_elf_size_dynamic_sections): Warn on discarding
|
||||
non-empty dynamic section.
|
||||
(ppc_build_one_stub): Take elf_gp from output bfd, not output
|
||||
section owner.
|
||||
(ppc_size_one_stub, ppc64_elf_next_toc_section): Likewise.
|
||||
|
||||
2017-11-14 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (ppc64_elf_size_stubs): Correct test for user
|
||||
|
@ -10202,6 +10202,10 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bfd_is_abs_section (s->output_section))
|
||||
_bfd_error_handler (_("warning: discarding dynamic section %s"),
|
||||
s->name);
|
||||
|
||||
if ((s->flags & SEC_HAS_CONTENTS) == 0)
|
||||
continue;
|
||||
|
||||
@ -10996,7 +11000,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
|
||||
+ htab->brlt->output_section->vma);
|
||||
|
||||
off = (dest
|
||||
- elf_gp (htab->brlt->output_section->owner)
|
||||
- elf_gp (info->output_bfd)
|
||||
- htab->sec_info[stub_entry->group->link_sec->id].toc_off);
|
||||
|
||||
if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
|
||||
@ -11147,7 +11151,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
|
||||
}
|
||||
|
||||
off = (dest
|
||||
- elf_gp (plt->output_section->owner)
|
||||
- elf_gp (info->output_bfd)
|
||||
- htab->sec_info[stub_entry->group->link_sec->id].toc_off);
|
||||
|
||||
if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
|
||||
@ -11295,7 +11299,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
|
||||
plt = htab->elf.iplt;
|
||||
off += (plt->output_offset
|
||||
+ plt->output_section->vma
|
||||
- elf_gp (plt->output_section->owner)
|
||||
- elf_gp (info->output_bfd)
|
||||
- htab->sec_info[stub_entry->group->link_sec->id].toc_off);
|
||||
|
||||
size = plt_stub_size (htab, stub_entry, off);
|
||||
@ -11398,7 +11402,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
|
||||
off = (br_entry->offset
|
||||
+ htab->brlt->output_offset
|
||||
+ htab->brlt->output_section->vma
|
||||
- elf_gp (htab->brlt->output_section->owner)
|
||||
- elf_gp (info->output_bfd)
|
||||
- htab->sec_info[stub_entry->group->link_sec->id].toc_off);
|
||||
|
||||
if (info->emitrelocations)
|
||||
@ -11518,7 +11522,7 @@ ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
|
||||
output toc base plus 0x8000. Making the input elf_gp an
|
||||
offset allows us to move the toc as a whole without
|
||||
recalculating input elf_gp. */
|
||||
off = htab->toc_curr - elf_gp (isec->output_section->owner);
|
||||
off = htab->toc_curr - elf_gp (info->output_bfd);
|
||||
off += TOC_BASE_OFF;
|
||||
|
||||
/* Die if someone uses a linker script that doesn't keep input
|
||||
@ -11547,7 +11551,7 @@ ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
|
||||
}
|
||||
addr = (htab->toc_first_sec->output_offset
|
||||
+ htab->toc_first_sec->output_section->vma);
|
||||
off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
|
||||
off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
|
||||
elf_gp (isec->owner) = off;
|
||||
|
||||
return TRUE;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2017-11-14 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/ld-elf/note-3.t: Don't discard .got.
|
||||
|
||||
2017-11-14 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/ld-ifunc/ifunc.exp: Ensure non-PIC tests are really
|
||||
|
@ -18,6 +18,7 @@ SECTIONS
|
||||
|
||||
.dynstr : { *(.dynstr) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.got : { *(.got .toc) *(.igot) }
|
||||
.got.plt : { *(.got.plt) *(.igot.plt) }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user