From: Alan Modra Date: Tue, 14 Nov 2017 08:17:34 +0000 (+1030) Subject: PR22431, powerpc64 ld segfault when .plt discarded X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=06bcf5416feae129e239476ab1408e038bba171d;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1c9edaf7c7b..ea8efcf16a7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-11-14 Alan Modra + + 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 * elf64-ppc.c (ppc64_elf_size_stubs): Correct test for user diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 31ee4123b8e..8a48848eb27 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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; diff --git a/ld/ChangeLog b/ld/ChangeLog index 634c9903c07..fe8603cdd9a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2017-11-14 Alan Modra + + * testsuite/ld-elf/note-3.t: Don't discard .got. + 2017-11-14 Alan Modra * testsuite/ld-ifunc/ifunc.exp: Ensure non-PIC tests are really diff --git a/ld/testsuite/ld-elf/note-3.t b/ld/testsuite/ld-elf/note-3.t index 47f3fe1c95c..30ce59f93b5 100644 --- a/ld/testsuite/ld-elf/note-3.t +++ b/ld/testsuite/ld-elf/note-3.t @@ -18,6 +18,7 @@ SECTIONS .dynstr : { *(.dynstr) } .dynsym : { *(.dynsym) } + .got : { *(.got .toc) *(.igot) } .got.plt : { *(.got.plt) *(.igot.plt) } /DISCARD/ : { *(*) } }