aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCupertino Miranda <cmiranda@synopsys.com>2016-07-22 15:10:31 +0100
committerNick Clifton <nickc@redhat.com>2016-07-22 15:10:31 +0100
commitc02d11a585398734a2178d65a17411cd3050b9d2 (patch)
treec65e3f91740c6c214a9c03d5c15388093da7589b
parent70ad8739d8ec7a79ef28305c0975df503535b88a (diff)
downloadgdb-c02d11a585398734a2178d65a17411cd3050b9d2.zip
gdb-c02d11a585398734a2178d65a17411cd3050b9d2.tar.gz
gdb-c02d11a585398734a2178d65a17411cd3050b9d2.tar.bz2
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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/arc-got.h24
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/testsuite/ld-arc/got-01.d7
-rw-r--r--ld/testsuite/ld-arc/got-01.s5
5 files changed, 34 insertions, 13 deletions
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 <cmiranda@synopsys.com>
+
+ * 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 <hongjiu.lu@intel.com>
* 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 <cmiranda@synopsys.com>
+
+ * testsuite/ld-arc/got-01.d: New file.
+ * testsuite/ld-arc/got-01.s: New file.
+
2016-07-21 H.J. Lu <hongjiu.lu@intel.com>
* 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]