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]

Correct elf64-ppc.c handling of protected symbols


Some places in elf64-ppc.c carelessly used SYMBOL_CALLS_LOCAL when
the proper test is SYMBOL_REFERENCES_LOCAL for cases where we take the
address of a protected symbol.  This works OK for function descriptors
but not for ELFv2.  Setting symbols to their global entry stub a
little earlier is to ensure _bfd_elf_hash_symbol allows such symbols
in .gnu.hash.

	* elf64-ppc.c (ppc64_elf_edit_toc): Use SYMBOL_REFERENCES_LOCAL
	here, not SYMBOL_CALLS_LOCAL.
	(ppc64_elf_relocate_section): Likewise.
	(size_global_entry_stubs): Set undefined symbols on their global
	entry stubs here..
	(build_global_entry_stubs): ..rather than here.
	(ppc64_elf_build_stubs): Don't reset glink->size before calling
	build_global_entry_stubs.

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ccd7e7a..5c7c7aa 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2013-11-11  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* elf64-ppc.c (ppc64_elf_edit_toc): Use SYMBOL_REFERENCES_LOCAL
+	here, not SYMBOL_CALLS_LOCAL.
+	(ppc64_elf_relocate_section): Likewise.
+	(size_global_entry_stubs): Set undefined symbols on their global
+	entry stubs here..
+	(build_global_entry_stubs): ..rather than here.
+	(ppc64_elf_build_stubs): Don't reset glink->size before calling
+	build_global_entry_stubs.
+
 2013-11-07  Roland McGrath  <mcgrathr@google.com>
 
 	* archures.c (bfd_mach_i386_nacl): Fix definition so it doesn't
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 24c733e..ac7da56 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -8698,7 +8698,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
 		  || discarded_section (sym_sec))
 		continue;
 
-	      if (!SYMBOL_CALLS_LOCAL (info, h))
+	      if (!SYMBOL_REFERENCES_LOCAL (info, h))
 		continue;
 
 	      if (h != NULL)
@@ -9545,7 +9545,13 @@ size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
     if (pent->plt.offset != (bfd_vma) -1
 	&& pent->addend == 0)
       {
+	/* For ELFv2, if this symbol is not defined in a regular file
+	   and we are not generating a shared library or pie, then we
+	   need to define the symbol in the executable on a call stub.
+	   This is to avoid text relocations.  */
 	s->size = (s->size + 15) & -16;
+	h->root.u.def.section = s;
+	h->root.u.def.value = s->size;
 	s->size += 16;
 	break;
       }
@@ -12381,13 +12387,6 @@ build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
 	asection *plt;
 	bfd_vma off;
 
-	/* For ELFv2, if this symbol is not defined in a regular file
-	   and we are not generating a shared library or pie, then we
-	   need to define the symbol in the executable on a call stub.
-	   This is to avoid text relocations.  */
-	h->root.u.def.section = s;
-	h->root.u.def.value = s->size;
-	s->size += 16;
 	p = s->contents + h->root.u.def.value;
 	plt = htab->elf.splt;
 	if (!htab->elf.dynamic_sections_created
@@ -12583,10 +12582,7 @@ ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
 
       /* Build .glink global entry stubs.  */
       if (htab->glink->size > htab->glink->rawsize)
-	{
-	  htab->glink->size = (htab->glink->rawsize + 15) & -16;
-	  elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
-	}
+	elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
     }
 
   if (htab->brlt->size != 0)
@@ -13856,7 +13852,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
 		    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
 							  &h->elf)
 			|| (info->shared
-			    && SYMBOL_CALLS_LOCAL (info, &h->elf)))
+			    && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
 		      /* This is actually a static link, or it is a
 			 -Bsymbolic link and the symbol is defined
 			 locally, or the symbol was forced to be local
@@ -14241,7 +14237,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
 
 	      if (skip)
 		memset (&outrel, 0, sizeof outrel);
-	      else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
+	      else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
 		       && !is_opd
 		       && r_type != R_PPC64_TOC)
 		{
-- 
1.7.9.5


-- 
Alan Modra
Australia Development Lab, IBM


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