diff options
author | Nick Clifton <nickc@redhat.com> | 2017-02-27 11:33:05 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2017-02-27 11:33:05 +0000 |
commit | bd757ca7bf5886a4025ca02093fca1b8c5ce11a2 (patch) | |
tree | e2b2587f164b5455b842950401fb0dbded9e925b /bfd/elf32-microblaze.c | |
parent | 8e3681243c642d667164bd23ae9a376620da0780 (diff) | |
download | gdb-bd757ca7bf5886a4025ca02093fca1b8c5ce11a2.zip gdb-bd757ca7bf5886a4025ca02093fca1b8c5ce11a2.tar.gz gdb-bd757ca7bf5886a4025ca02093fca1b8c5ce11a2.tar.bz2 |
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.
Diffstat (limited to 'bfd/elf32-microblaze.c')
-rw-r--r-- | bfd/elf32-microblaze.c | 13 |
1 files changed, 10 insertions, 3 deletions
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 { |