mminimal-toc problems

Alan Modra amodra@bigpond.net.au
Wed Jul 2 07:35:00 GMT 2003


On Tue, Jul 01, 2003 at 01:22:53PM +0200, Olaf Hering wrote:
> /usr/lib64/gcc-lib/powerpc64-suse-linux/3.2.3/../../../../powerpc64-suse-linux/bin/ld: libbackend.a(toplev.o)(.text+0x504): sibling call optimization to `._savef14' does not allow automatic multiple TOCs; recompile with -mminimal-toc or -fno-optimize-sibling-calls, or make `._savef14' extern

The bug was a wrong opcode mask when looking for a "bl" instruction.
Finding that one promted me to check elsewhere, and turned up a couple
of other places.  The other changes are just insurance against people
building silly shared libs, and a small optimization in that we really
don't need to check .sfpr or .glink.

	* elf64-ppc.c (ppc64_elf_func_desc_adjust): Don't allow _savef* and
	_restf* to be satisfied by shared libs, and always force them local.
	(toc_adjusting_stub_needed): Avoid scanning linker created sections.
	Correct test for "bl".
	(ppc64_elf_relocate_section <R_PPC64_TLS>): Correct test for
	primary opcode 31.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.115
diff -u -p -r1.115 elf64-ppc.c
--- bfd/elf64-ppc.c	25 Jun 2003 06:40:21 -0000	1.115
+++ bfd/elf64-ppc.c	2 Jul 2003 07:00:09 -0000
@@ -4287,7 +4293,7 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
       sym[8] = i % 10 + '0';
       h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
       if (h != NULL
-	  && h->root.type == bfd_link_hash_undefined)
+	  && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
 	{
 	  if (lowest_savef > i)
 	    lowest_savef = i;
@@ -4296,7 +4302,7 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
 	  h->root.u.def.value = (i - lowest_savef) * 4;
 	  h->type = STT_FUNC;
 	  h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
-	  _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
+	  _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
 	}
     }
 
@@ -4307,7 +4313,7 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
       sym[8] = i % 10 + '0';
       h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
       if (h != NULL
-	  && h->root.type == bfd_link_hash_undefined)
+	  && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
 	{
 	  if (lowest_restf > i)
 	    lowest_restf = i;
@@ -4317,7 +4323,7 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
 				 + (i - lowest_restf) * 4);
 	  h->type = STT_FUNC;
 	  h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
-	  _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
+	  _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
 	}
     }
 
@@ -6374,6 +6380,10 @@ toc_adjusting_stub_needed (struct bfd_li
   int ret;
   int branch_ok;
 
+  /* We know none of our code bearing sections will need toc stubs.  */
+  if ((isec->flags & SEC_LINKER_CREATED) != 0)
+    return 0;
+
   /* Hack for linux kernel.  .fixup contains branches, but only back to
      the function that hit an exception.  */
   branch_ok = strcmp (isec->name, ".fixup") == 0;
@@ -6401,7 +6411,7 @@ toc_adjusting_stub_needed (struct bfd_li
     {
       unsigned long insn = bfd_get_32 (isec->owner, contents + i);
       /* Is this a branch?  */
-      if ((insn & (0x1f << 26)) == (18 << 26)
+      if ((insn & (0x3f << 26)) == (18 << 26)
 	  /* If branch and link, it's a function call.  */
 	  && ((insn & 1) != 0
 	      /* Sibling calls use a plain branch.  I don't know a way
@@ -7318,10 +7328,10 @@ ppc64_elf_relocate_section (bfd *output_
 	    {
 	      bfd_vma insn, rtra;
 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
-	      if ((insn & ((31 << 26) | (31 << 11)))
+	      if ((insn & ((0x3f << 26) | (31 << 11)))
 		  == ((31 << 26) | (13 << 11)))
 		rtra = insn & ((1 << 26) - (1 << 16));
-	      else if ((insn & ((31 << 26) | (31 << 16)))
+	      else if ((insn & ((0x3f << 26) | (31 << 16)))
 		       == ((31 << 26) | (13 << 16)))
 		rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
 	      else

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre



More information about the Binutils mailing list