This is the mail archive of the binutils@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]

[PATCH] arc: Fix segfault when generating got entries for local symbols


Commit 08759e0fc8b0de1c56ad388212a104f3a6d61c25 (Fixes done to TLS)
introduced a segfault when generating got entries for local symbols.
Fixed in this commit and a test added.

bfd/ChangeLog:

	* 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/ChangeLog:

	* testsuite/ld-arc/got-01.d: New file.
	* testsuite/ld-arc/got-01.s: New file.
---
 bfd/ChangeLog                |  6 ++++++
 bfd/arc-got.h                | 22 ++++++++++------------
 ld/ChangeLog                 |  5 +++++
 ld/testsuite/ld-arc/got-01.d |  7 +++++++
 ld/testsuite/ld-arc/got-01.s |  5 +++++
 5 files changed, 33 insertions(+), 12 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/arc-got.h b/bfd/arc-got.h
index 9e8fd10..0571400 100644
--- a/bfd/arc-got.h
+++ b/bfd/arc-got.h
@@ -367,12 +367,20 @@ 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 "
+			       "@ 0x%08x for sym %s in got offset 0x%x "
+			       "(is undefweak)\n",
+			       htab->sgot->output_section->vma
+			       + htab->sgot->output_offset + entry->offset,
+			       symbol_name,
+			       entry->offset);
+		  else
 		    {
 		      bfd_put_32 (output_bfd,
 				  reloc_data->sym_value + sec_vma,
 				  htab->sgot->contents + entry->offset);
-
 		      ARC_DEBUG ("arc_info: PATCHED: 0x%08x "
 				 "@ 0x%08x for sym %s in got offset 0x%x\n",
 				 reloc_data->sym_value + sec_vma,
@@ -381,16 +389,6 @@ relocate_fix_got_relocs_for_got_info (struct got_entry **list_p,
 				 symbol_name,
 				 entry->offset);
 		    }
-		  else
-		    {
-		      ARC_DEBUG ("arc_info: PATCHED: NOT_PATCHED "
-				 "@ 0x%08x for sym %s in got offset 0x%x "
-				 "(is undefweak)\n",
-				 htab->sgot->output_section->vma
-				 + htab->sgot->output_offset + entry->offset,
-				 symbol_name,
-				 entry->offset);
-		  }
 		}
 		break;
 	      default:
diff --git a/ld/testsuite/ld-arc/got-01.d b/ld/testsuite/ld-arc/got-01.d
new file mode 100644
index 0000000..b9d156e
--- /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 9 section headers, starting at offset 0x[0-9a-f]+:
+#...
\ No newline at end of file
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.5.1


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