This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] Fix segfault in microblaze linker when garbage collection removes a symbol scheduled for a slot in t
- From: Nick Clifton <nickc at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 27 Feb 2017 11:33:50 -0000
- Subject: [binutils-gdb] Fix segfault in microblaze linker when garbage collection removes a symbol scheduled for a slot in t
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bd757ca7bf5886a4025ca02093fca1b8c5ce11a2
commit bd757ca7bf5886a4025ca02093fca1b8c5ce11a2
Author: Nick Clifton <nickc@redhat.com>
Date: Mon Feb 27 11:33:05 2017 +0000
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.
Diff:
---
bfd/ChangeLog | 7 +++++++
bfd/elf32-microblaze.c | 13 ++++++++++---
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1118c19..0f8d9ee 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2017-02-27 Nick Clifton <nickc@redhat.com>
+
+ 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 <amodra@gmail.com>
* elf32-arc.c (struct dynamic_sections): Delete.
diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c
index 7061328..27118c1 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
{