[binutils-gdb] PR23207, hppa ld SIGSEGVs on invalid object files

Alan Modra amodra@sourceware.org
Tue May 22 10:07:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=215f527155ea776fff3f2f836d5da1e300e8c370

commit 215f527155ea776fff3f2f836d5da1e300e8c370
Author: Alan Modra <amodra@gmail.com>
Date:   Tue May 22 18:34:18 2018 +0930

    PR23207, hppa ld SIGSEGVs on invalid object files
    
    The last patch was enough to cure the testcase, but not the original
    object file.  This patch does the same for hppa as is done for ppc64,
    simply test for the section belonging to a group.  I've also
    restricted stubs to load, alloc, code sections.
    
    	PR 23207
    	* elf32-hppa.c (hppa_get_stub_entry): Return NULL when link_sec
    	is NULL.
    	(elf32_hppa_size_stubs): Only create stubs for load, alloc, code
    	sections.
    	(final_link_relocate): Revert last change.

Diff:
---
 bfd/ChangeLog    |  9 +++++++++
 bfd/elf32-hppa.c | 24 ++++++++++++++----------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b4caff9..1f6a85f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,15 @@
 2018-05-22  Alan Modra  <amodra@gmail.com>
 
 	PR 23207
+	* elf32-hppa.c (hppa_get_stub_entry): Return NULL when link_sec
+	is NULL.
+	(elf32_hppa_size_stubs): Only create stubs for load, alloc, code
+	sections.
+	(final_link_relocate): Revert last change.
+
+2018-05-22  Alan Modra  <amodra@gmail.com>
+
+	PR 23207
 	* elf32-hppa.c (final_link_relocate): Don't look for plt call
 	stubs in non-alloc sections.
 
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 5ad49ab..efab20f 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -503,6 +503,8 @@ hppa_get_stub_entry (const asection *input_section,
      more than one stub used to reach say, printf, and we need to
      distinguish between them.  */
   id_sec = htab->stub_group[input_section->id].link_sec;
+  if (id_sec == NULL)
+    return NULL;
 
   if (hh != NULL && hh->hsh_cache != NULL
       && hh->hsh_cache->hh == hh
@@ -2795,6 +2797,9 @@ elf32_hppa_size_stubs
 	      /* If there aren't any relocs, then there's nothing more
 		 to do.  */
 	      if ((section->flags & SEC_RELOC) == 0
+		  || (section->flags & SEC_ALLOC) == 0
+		  || (section->flags & SEC_LOAD) == 0
+		  || (section->flags & SEC_CODE) == 0
 		  || section->reloc_count == 0)
 		continue;
 
@@ -3267,16 +3272,15 @@ final_link_relocate (asection *input_section,
     case R_PARISC_PCREL22F:
       /* If this call should go via the plt, find the import stub in
 	 the stub hash.  */
-      if ((input_section->flags & SEC_ALLOC) != 0
-	  && (sym_sec == NULL
-	      || sym_sec->output_section == NULL
-	      || (hh != NULL
-		  && hh->eh.plt.offset != (bfd_vma) -1
-		  && hh->eh.dynindx != -1
-		  && !hh->plabel
-		  && (bfd_link_pic (info)
-		      || !hh->eh.def_regular
-		      || hh->eh.root.type == bfd_link_hash_defweak))))
+      if (sym_sec == NULL
+	  || sym_sec->output_section == NULL
+	  || (hh != NULL
+	      && hh->eh.plt.offset != (bfd_vma) -1
+	      && hh->eh.dynindx != -1
+	      && !hh->plabel
+	      && (bfd_link_pic (info)
+		  || !hh->eh.def_regular
+		  || hh->eh.root.type == bfd_link_hash_defweak)))
 	{
 	  hsh = hppa_get_stub_entry (input_section, sym_sec,
 				     hh, rela, htab);



More information about the Binutils-cvs mailing list