This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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
         {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]