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

(ppc64_elf_build_stubs): Build them here instead.
This commit is contained in:
Alan Modra 2002-09-26 05:19:38 +00:00
parent c66d951ee2
commit 9f951329b6
2 changed files with 29 additions and 26 deletions

View File

@ -1,3 +1,8 @@
2002-09-26 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc_build_one_stub): Don't build glink stubs here.
(ppc64_elf_build_stubs): Build them here instead.
2002-09-24 Jakub Jelinek <jakub@redhat.com> 2002-09-24 Jakub Jelinek <jakub@redhat.com>
* elf32-sparc.c (elf32_sparc_relocate_section): Put R_SPARC_RELATIVE * elf32-sparc.c (elf32_sparc_relocate_section): Put R_SPARC_RELATIVE

View File

@ -4464,27 +4464,6 @@ ppc_build_one_stub (gen_entry, in_arg)
break; break;
case ppc_stub_plt_call: 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 /* Do the best we can for shared libraries built without
exporting ".foo" for each "foo". This can happen when symbol exporting ".foo" for each "foo". This can happen when symbol
versioning scripts strip all bar a subset of symbols. */ versioning scripts strip all bar a subset of symbols. */
@ -5149,6 +5128,8 @@ ppc64_elf_build_stubs (info)
if (htab->splt != NULL) if (htab->splt != NULL)
{ {
unsigned int indx;
/* Build the .glink plt call stub. */ /* Build the .glink plt call stub. */
plt_r2 = (htab->splt->output_offset plt_r2 = (htab->splt->output_offset
+ htab->splt->output_section->vma + htab->splt->output_section->vma
@ -5156,15 +5137,33 @@ ppc64_elf_build_stubs (info)
- TOC_BASE_OFF); - TOC_BASE_OFF);
p = htab->sglink->contents; p = htab->sglink->contents;
p = build_plt_stub (htab->sglink->owner, p, (int) plt_r2, 1); 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); bfd_put_32 (htab->sglink->owner, NOP, p);
p += 4; p += 4;
} }
htab->sglink->_cooked_size = p - htab->sglink->contents;
/* Use reloc_count to count entries. */ /* Build the .glink lazy link call stubs. */
htab->sglink->reloc_count = 0; 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) 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. */ /* Build the stubs as directed by the stub hash table. */
bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info); bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
htab->sglink->reloc_count = 0;
for (stub_sec = htab->stub_bfd->sections; for (stub_sec = htab->stub_bfd->sections;
stub_sec != NULL; stub_sec != NULL;