Fix segfault in microblaze linker when garbage collection removes a symbol scheduled...
authorNick Clifton <nickc@redhat.com>
Mon, 27 Feb 2017 11:33:05 +0000 (11:33 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 27 Feb 2017 11:33:05 +0000 (11:33 +0000)
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
bfd/elf32-microblaze.c

index 1118c19..0f8d9ee 100644 (file)
@@ -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.
index 7061328..27118c1 100644 (file)
@@ -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
         {