* elf64-ppc.c (struct ppc_link_hash_table): Remove have_undefweak.
(func_desc_adjust): Don't set have_undefweak. (ppc64_elf_func_desc_adjust): Don't add an extr nop to sfpr. (ppc64_elf_relocate_section): NOP out calls to undefweak functions.
This commit is contained in:
parent
34814b9fa0
commit
06da1e8e7b
|
@ -1,5 +1,10 @@
|
||||||
2004-08-09 Alan Modra <amodra@bigpond.net.au>
|
2004-08-09 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf64-ppc.c (struct ppc_link_hash_table): Remove have_undefweak.
|
||||||
|
(func_desc_adjust): Don't set have_undefweak.
|
||||||
|
(ppc64_elf_func_desc_adjust): Don't add an extr nop to sfpr.
|
||||||
|
(ppc64_elf_relocate_section): NOP out calls to undefweak functions.
|
||||||
|
|
||||||
* elf64-ppc.c (struct ppc_link_hash_entry): Make "oh" a
|
* elf64-ppc.c (struct ppc_link_hash_entry): Make "oh" a
|
||||||
"struct ppc_link_hash_entry *". Adjust all references.
|
"struct ppc_link_hash_entry *". Adjust all references.
|
||||||
(ppc64_elf_hide_symbol): Correct a comment.
|
(ppc64_elf_hide_symbol): Correct a comment.
|
||||||
|
|
|
@ -2872,9 +2872,6 @@ struct ppc_link_hash_table
|
||||||
select suitable defaults for the stub group size. */
|
select suitable defaults for the stub group size. */
|
||||||
unsigned int has_14bit_branch;
|
unsigned int has_14bit_branch;
|
||||||
|
|
||||||
/* Set if we detect a reference undefined weak symbol. */
|
|
||||||
unsigned int have_undefweak;
|
|
||||||
|
|
||||||
/* Incremented every time we size stubs. */
|
/* Incremented every time we size stubs. */
|
||||||
unsigned int stub_iteration;
|
unsigned int stub_iteration;
|
||||||
|
|
||||||
|
@ -4355,10 +4352,6 @@ func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
|
||||||
if (!fh->is_func)
|
if (!fh->is_func)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (fh->elf.root.type == bfd_link_hash_undefweak
|
|
||||||
&& (fh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR))
|
|
||||||
htab->have_undefweak = TRUE;
|
|
||||||
|
|
||||||
for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
|
for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
|
||||||
if (ent->plt.refcount > 0)
|
if (ent->plt.refcount > 0)
|
||||||
break;
|
break;
|
||||||
|
@ -4525,13 +4518,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
|
||||||
|
|
||||||
if (htab->sfpr->size == 0)
|
if (htab->sfpr->size == 0)
|
||||||
{
|
{
|
||||||
if (!htab->have_undefweak)
|
_bfd_strip_section_from_output (info, htab->sfpr);
|
||||||
{
|
return TRUE;
|
||||||
_bfd_strip_section_from_output (info, htab->sfpr);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
htab->sfpr->size = 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p = bfd_alloc (htab->elf.dynobj, htab->sfpr->size);
|
p = bfd_alloc (htab->elf.dynobj, htab->sfpr->size);
|
||||||
|
@ -4559,11 +4547,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
|
||||||
bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p);
|
bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p);
|
||||||
p += 4;
|
p += 4;
|
||||||
}
|
}
|
||||||
if (lowest_restf <= MAX_SAVE_FPR
|
if (lowest_restf <= MAX_SAVE_FPR)
|
||||||
|| htab->sfpr->size == 4)
|
bfd_put_32 (htab->elf.dynobj, BLR, p);
|
||||||
{
|
|
||||||
bfd_put_32 (htab->elf.dynobj, BLR, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -7988,28 +7973,16 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* NOP out calls to undefined weak functions.
|
||||||
|
We can thus call a weak function without first
|
||||||
|
checking whether the function is defined. */
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& h->root.type == bfd_link_hash_undefweak
|
&& h->root.type == bfd_link_hash_undefweak
|
||||||
&& relocation == 0
|
&& relocation == 0
|
||||||
&& rel->r_addend == 0)
|
&& rel->r_addend == 0)
|
||||||
{
|
{
|
||||||
/* Tweak calls to undefined weak functions to point at a
|
bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
|
||||||
blr. We can thus call a weak function without first
|
continue;
|
||||||
checking whether the function is defined. We have a
|
|
||||||
blr at the end of .sfpr. */
|
|
||||||
BFD_ASSERT (htab->sfpr->size != 0);
|
|
||||||
relocation = (htab->sfpr->size - 4
|
|
||||||
+ htab->sfpr->output_offset
|
|
||||||
+ htab->sfpr->output_section->vma);
|
|
||||||
from = (rel->r_offset
|
|
||||||
+ input_section->output_offset
|
|
||||||
+ input_section->output_section->vma);
|
|
||||||
|
|
||||||
/* But let's not be silly about it. If the blr isn't in
|
|
||||||
reach, just go to the next instruction. */
|
|
||||||
if (relocation - from + (1 << 25) >= (1 << 26)
|
|
||||||
|| htab->sfpr->size == 0)
|
|
||||||
relocation = from + 4;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue