From c02d11a585398734a2178d65a17411cd3050b9d2 Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Fri, 22 Jul 2016 15:10:31 +0100 Subject: [PATCH] Fix segfault in ARC linker when generating got entries for local symbols. bfd * arc-got.h (relocate_fix_got_relocs_for_got_info): Handle the case where there's no elf_link_hash_entry while processing GOT_NORMAL got entries. ld * testsuite/ld-arc/got-01.d: New file. * testsuite/ld-arc/got-01.s: New file. --- bfd/ChangeLog | 6 ++++++ bfd/arc-got.h | 24 +++++++++++------------- ld/ChangeLog | 5 +++++ ld/testsuite/ld-arc/got-01.d | 7 +++++++ ld/testsuite/ld-arc/got-01.s | 5 +++++ 5 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 ld/testsuite/ld-arc/got-01.d create mode 100644 ld/testsuite/ld-arc/got-01.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 63daac4..ab92c6c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-07-22 Cupertino Miranda + + * arc-got.h (relocate_fix_got_relocs_for_got_info): Handle the + case where there's no elf_link_hash_entry while processing + GOT_NORMAL got entries. + 2016-07-21 H.J. Lu * version.m4 (BFD_VERSION): Set to 2.27.51. diff --git a/bfd/arc-got.h b/bfd/arc-got.h index 00deb01..7c3cfd9 100644 --- a/bfd/arc-got.h +++ b/bfd/arc-got.h @@ -369,12 +369,21 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p, = reloc_data->sym_section->output_section->vma + reloc_data->sym_section->output_offset; - if (h->root.type != bfd_link_hash_undefweak) + if (h != NULL + && h->root.type == bfd_link_hash_undefweak) + ARC_DEBUG ("arc_info: PATCHED: NOT_PATCHED " + "@ %#08lx for sym %s in got offset %#lx " + "(is undefweak)\n", + (long) (htab->sgot->output_section->vma + + htab->sgot->output_offset + + entry->offset), + symbol_name, + (long) entry->offset); + else { bfd_put_32 (output_bfd, reloc_data->sym_value + sec_vma, htab->sgot->contents + entry->offset); - ARC_DEBUG ("arc_info: PATCHED: %#08lx " "@ %#08lx for sym %s in got offset %#lx\n", (long) (reloc_data->sym_value + sec_vma), @@ -383,17 +392,6 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p, symbol_name, (long) entry->offset); } - else - { - ARC_DEBUG ("arc_info: PATCHED: NOT_PATCHED " - "@ %#08lx for sym %s in got offset %#lx " - "(is undefweak)\n", - (long) (htab->sgot->output_section->vma - + htab->sgot->output_offset - + entry->offset), - symbol_name, - (long) entry->offset); - } } break; default: diff --git a/ld/ChangeLog b/ld/ChangeLog index 21105c0..728c6b0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2016-07-22 Cupertino Miranda + + * testsuite/ld-arc/got-01.d: New file. + * testsuite/ld-arc/got-01.s: New file. + 2016-07-21 H.J. Lu * configure: Regenerated. diff --git a/ld/testsuite/ld-arc/got-01.d b/ld/testsuite/ld-arc/got-01.d new file mode 100644 index 0000000..c34d6a7 --- /dev/null +++ b/ld/testsuite/ld-arc/got-01.d @@ -0,0 +1,7 @@ +#source: got-01.s +#as: -mcpu=arc700 +#ld: +#readelf: -S + +There are . section headers, starting at offset 0x[0-9a-f]+: +#... diff --git a/ld/testsuite/ld-arc/got-01.s b/ld/testsuite/ld-arc/got-01.s new file mode 100644 index 0000000..4e1b406 --- /dev/null +++ b/ld/testsuite/ld-arc/got-01.s @@ -0,0 +1,5 @@ + .text + .global __start +__start: +foo: + ld r0, [pcl, foo@gotpc] -- 2.7.4