This is the mail archive of the binutils@sources.redhat.com 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]

powerpc64-linux glink size problem


On large applications, powerpc64-linux-ld complains "stubs don't match
calculated size" because I was building one glink lazy link stub per
plt call stub instead of one glink stub per plt entry.  When
application size exceeds the reach of a 24 bit branch, multiple plt
call stubs might be needed for a single plt entry, causing too many
glink call stubs to be generated.

	* elf64-ppc.c (ppc_build_one_stub): Don't build glink stubs here.
	(ppc64_elf_build_stubs): Build them here instead.

Applying mainline and branch.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.63
diff -u -p -r1.63 elf64-ppc.c
--- bfd/elf64-ppc.c	22 Aug 2002 01:27:19 -0000	1.63
+++ bfd/elf64-ppc.c	26 Sep 2002 05:13:24 -0000
@@ -4464,27 +4464,6 @@ ppc_build_one_stub (gen_entry, in_arg)
       break;
 
     case ppc_stub_plt_call:
-      /* Build the .glink lazy link call stub.  */
-      p = htab->sglink->contents + htab->sglink->_cooked_size;
-      indx = htab->sglink->reloc_count;
-      if (indx < 0x8000)
-	{
-	  bfd_put_32 (htab->sglink->owner, LI_R0_0 | indx, p);
-	  p += 4;
-	}
-      else
-	{
-	  bfd_put_32 (htab->sglink->owner, LIS_R0_0 | PPC_HI (indx), p);
-	  p += 4;
-	  bfd_put_32 (htab->sglink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
-	  p += 4;
-	}
-      bfd_put_32 (htab->sglink->owner,
-		  B_DOT | ((htab->sglink->contents - p) & 0x3fffffc), p);
-      p += 4;
-      htab->sglink->_cooked_size = p - htab->sglink->contents;
-      htab->sglink->reloc_count += 1;
-
       /* Do the best we can for shared libraries built without
 	 exporting ".foo" for each "foo".  This can happen when symbol
 	 versioning scripts strip all bar a subset of symbols.  */
@@ -5149,6 +5128,8 @@ ppc64_elf_build_stubs (info)
 
   if (htab->splt != NULL)
     {
+      unsigned int indx;
+
       /* Build the .glink plt call stub.  */
       plt_r2 = (htab->splt->output_offset
 		+ htab->splt->output_section->vma
@@ -5156,15 +5137,33 @@ ppc64_elf_build_stubs (info)
 		- TOC_BASE_OFF);
       p = htab->sglink->contents;
       p = build_plt_stub (htab->sglink->owner, p, (int) plt_r2, 1);
-      while (p - htab->sglink->contents < GLINK_CALL_STUB_SIZE)
+      while (p < htab->sglink->contents + GLINK_CALL_STUB_SIZE)
 	{
 	  bfd_put_32 (htab->sglink->owner, NOP, p);
 	  p += 4;
 	}
-      htab->sglink->_cooked_size = p - htab->sglink->contents;
 
-      /* Use reloc_count to count entries.  */
-      htab->sglink->reloc_count = 0;
+      /* Build the .glink lazy link call stubs.  */
+      indx = 0;
+      while (p < htab->sglink->contents + htab->sglink->_raw_size)
+	{
+	  if (indx < 0x8000)
+	    {
+	      bfd_put_32 (htab->sglink->owner, LI_R0_0 | indx, p);
+	      p += 4;
+	    }
+	  else
+	    {
+	      bfd_put_32 (htab->sglink->owner, LIS_R0_0 | PPC_HI (indx), p);
+	      p += 4;
+	      bfd_put_32 (htab->sglink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
+	      p += 4;
+	    }
+	  bfd_put_32 (htab->sglink->owner,
+		      B_DOT | ((htab->sglink->contents - p) & 0x3fffffc), p);
+	  p += 4;
+	}
+      htab->sglink->_cooked_size = p - htab->sglink->contents;
     }
 
   if (htab->sbrlt->_raw_size != 0)
@@ -5177,7 +5176,6 @@ ppc64_elf_build_stubs (info)
 
   /* Build the stubs as directed by the stub hash table.  */
   bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
-  htab->sglink->reloc_count = 0;
 
   for (stub_sec = htab->stub_bfd->sections;
        stub_sec != NULL;


-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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