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

[binutils-gdb] PowerPC64 debian bug 886264, out-of-line save/restore functions


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

commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Mar 14 22:09:33 2018 +1030

    PowerPC64 debian bug 886264, out-of-line save/restore functions
    
    This calculation in relocate_section
    
    	      if (stub_entry->stub_type == ppc_stub_save_res)
    		relocation += (stub_sec->output_offset
    			       + stub_sec->output_section->vma
    			       + stub_sec->size - htab->sfpr->size
    			       - htab->sfpr->output_offset
    			       - htab->sfpr->output_section->vma);
    
    to adjust from the original out-of-line save/restore function address
    in sfpr to a copy at the end of stub_sec goes wrong when stub_sec is
    padded, because the copy is no longer at the end of stub_sec.  The
    solution is to pad before copying sfpr, so the copy is always at the
    end of stub_sec.
    
    	* elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
    	sfpr size added before defining alias symbols.
    	(ppc64_elf_build_stubs): Add stub section padding before
    	copying sfpr contents and defining save/restore alias symbols.

Diff:
---
 bfd/ChangeLog   |  7 +++++++
 bfd/elf64-ppc.c | 33 ++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ad971fc..fac9b62 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-14  Alan Modra  <amodra@gmail.com>
+
+	* elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
+	sfpr size added before defining alias symbols.
+	(ppc64_elf_build_stubs): Add stub section padding before
+	copying sfpr contents and defining save/restore alias symbols.
+
 2018-03-14  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/20882
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 44237bc..889bdb0 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -6660,7 +6660,7 @@ sfpr_define (struct bfd_link_info *info,
 		{
 		  s->root.type = bfd_link_hash_defined;
 		  s->root.u.def.section = stub_sec;
-		  s->root.u.def.value = (stub_sec->size
+		  s->root.u.def.value = (stub_sec->size - htab->sfpr->size
 					 + h->elf.root.u.def.value);
 		  s->ref_regular = 1;
 		  s->def_regular = 1;
@@ -13247,20 +13247,7 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
 
   for (group = htab->group; group != NULL; group = group->next)
     if (group->needs_save_res)
-      {
-	stub_sec = group->stub_sec;
-	memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
-		htab->sfpr->size);
-	if (htab->params->emit_stub_syms)
-	  {
-	    unsigned int i;
-
-	    for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
-	      if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
-		return FALSE;
-	  }
-	stub_sec->size += htab->sfpr->size;
-      }
+      group->stub_sec->size += htab->sfpr->size;
 
   if (htab->relbrlt != NULL)
     htab->relbrlt->reloc_count = 0;
@@ -13274,6 +13261,22 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
 	}
 
   for (group = htab->group; group != NULL; group = group->next)
+    if (group->needs_save_res)
+      {
+	stub_sec = group->stub_sec;
+	memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
+		htab->sfpr->contents, htab->sfpr->size);
+	if (htab->params->emit_stub_syms)
+	  {
+	    unsigned int i;
+
+	    for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
+	      if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
+		return FALSE;
+	  }
+      }
+
+  for (group = htab->group; group != NULL; group = group->next)
     if ((stub_sec = group->stub_sec) != NULL)
       {
 	stub_sec_count += 1;


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