From bd757ca7bf5886a4025ca02093fca1b8c5ce11a2 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 27 Feb 2017 11:33:05 +0000 Subject: [PATCH] Fix segfault in microblaze linker when garbage collection removes a symbol scheduled for a slot in the PLT. PR ld/21180 * elf32-microblaze.c (microblaze_elf_finish_dynamic_symbol): Avoid generating a seg-fault when encountering a symbol that has been deleted by garbage collection. --- bfd/ChangeLog | 7 +++++++ bfd/elf32-microblaze.c | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1118c19e01..0f8d9eec6f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2017-02-27 Nick Clifton + + PR ld/21180 + * elf32-microblaze.c (microblaze_elf_finish_dynamic_symbol): Avoid + generating a seg-fault when encountering a symbol that has been + deleted by garbage collection. + 2017-02-25 Alan Modra * elf32-arc.c (struct dynamic_sections): Delete. diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c index 70613284cd..27118c1ef0 100644 --- a/bfd/elf32-microblaze.c +++ b/bfd/elf32-microblaze.c @@ -3234,13 +3234,20 @@ microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, || h->dynindx == -1)) { asection *sec = h->root.u.def.section; + bfd_vma value; + + value = h->root.u.def.value; + if (sec->output_section != NULL) + /* PR 21180: If the output section is NULL, then the symbol is no + longer needed, and in theory the GOT entry is redundant. But + it is too late to change our minds now... */ + value += sec->output_section->vma + sec->output_offset; + microblaze_elf_output_dynamic_relocation (output_bfd, srela, srela->reloc_count++, /* symindex= */ 0, R_MICROBLAZE_REL, offset, - h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); + value); } else {