[PATCH, PPC64] Use unadjusted reloc for stub lookup.

Doug Kwan (關振德) dougkwan@google.com
Wed Sep 12 18:20:00 GMT 2012


Hi,

     This is a patch for the PPC64 backend.  The problem is that OPD
optimization adjusts addend of a reloc in
ppc64_elf_relocate_section().  Then the addend is used to generate a
stub name for lookup.  Since the stub name is changed, a stub cannot
be located when it should be.  The fix is to save the reloc before
adjustment and use the original value for stub lookup.

-Doug


2012-09-12  Doug Kwan  <dougkwan@google.com>

	* elf64-ppc.c (ppc64_elf_relocate_section): Use pre-adjusted
	relocation for stub lookup.
-------------- next part --------------
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.392
diff -u -u -p -r1.392 elf64-ppc.c
--- bfd/elf64-ppc.c	31 Aug 2012 02:42:57 -0000	1.392
+++ bfd/elf64-ppc.c	12 Sep 2012 17:54:26 -0000
@@ -12249,7 +12249,7 @@ ppc64_elf_relocate_section (bfd *output_
   for (; rel < relend; rel++)
     {
       enum elf_ppc64_reloc_type r_type;
-      bfd_vma addend, orig_addend;
+      bfd_vma addend;
       bfd_reloc_status_type r;
       Elf_Internal_Sym *sym;
       asection *sec;
@@ -12269,6 +12269,7 @@ ppc64_elf_relocate_section (bfd *output_
       struct ppc_stub_hash_entry *stub_entry;
       bfd_vma max_br_offset;
       bfd_vma from;
+      const Elf_Internal_Rela orig_rel = *rel;
 
       r_type = ELF64_R_TYPE (rel->r_info);
       r_symndx = ELF64_R_SYM (rel->r_info);
@@ -12288,7 +12289,6 @@ ppc64_elf_relocate_section (bfd *output_
       sym_name = NULL;
       unresolved_reloc = FALSE;
       warned = FALSE;
-      orig_addend = rel->r_addend;
 
       if (r_symndx < symtab_hdr->sh_info)
 	{
@@ -12877,7 +12877,8 @@ ppc64_elf_relocate_section (bfd *output_
 	      && h->oh != NULL
 	      && h->oh->is_func_descriptor)
 	    fdh = ppc_follow_link (h->oh);
-	  stub_entry = ppc_get_stub_entry (input_section, sec, fdh, rel, htab);
+	  stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
+					   htab);
 	  if (stub_entry != NULL
 	      && (stub_entry->stub_type == ppc_stub_plt_call
 		  || stub_entry->stub_type == ppc_stub_plt_call_r2save
@@ -13159,7 +13160,7 @@ ppc64_elf_relocate_section (bfd *output_
 		  }
 
 		for (; ent != NULL; ent = ent->next)
-		  if (ent->addend == orig_addend
+		  if (ent->addend == orig_rel.r_addend
 		      && ent->owner == input_bfd
 		      && ent->tls_type == tls_type)
 		    break;
@@ -13312,7 +13313,7 @@ ppc64_elf_relocate_section (bfd *output_
 	    {
 	      struct plt_entry *ent;
 	      for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
-		if (ent->addend == orig_addend
+		if (ent->addend == orig_rel.r_addend
 		    && ent->plt.offset != (bfd_vma) -1)
 		  {
 		    relocation = (htab->plt->output_section->vma
@@ -13884,7 +13885,8 @@ ppc64_elf_relocate_section (bfd *output_
 	      if (!((*info->callbacks->reloc_overflow)
 		    (info, (h ? &h->elf.root : NULL), sym_name,
 		     ppc64_elf_howto_table[r_type]->name,
-		     orig_addend, input_bfd, input_section, rel->r_offset)))
+		     orig_rel.r_addend, input_bfd, input_section,
+		     rel->r_offset)))
 		return FALSE;
 	    }
 	  else


More information about the Binutils mailing list