This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
powerpc64-linux glink size problem
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Cc: Michal Ostrowski <mostrows at watson dot ibm dot com>
- Date: Thu, 26 Sep 2002 14:48:25 +0930
- Subject: 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