mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-30 05:14:18 +08:00
* elf32-ppc.c (ppc_elf_check_relocs): Set PLT_IFUNC in local got
masks for all local ifunc syms. (allocate_dynrelocs): Don't use htab->relgot for ifunc. (ppc_elf_size_dynamic_sections): Likewise. (ppc_elf_relocate_section): Likewise.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2013-03-27 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* elf32-ppc.c (ppc_elf_check_relocs): Set PLT_IFUNC in local got
|
||||||
|
masks for all local ifunc syms.
|
||||||
|
(allocate_dynrelocs): Don't use htab->relgot for ifunc.
|
||||||
|
(ppc_elf_size_dynamic_sections): Likewise.
|
||||||
|
(ppc_elf_relocate_section): Likewise.
|
||||||
|
|
||||||
2013-03-27 Will Newton <will.newton@linaro.org>
|
2013-03-27 Will Newton <will.newton@linaro.org>
|
||||||
|
|
||||||
* elf32-arm.c (elf32_arm_final_link_relocate): Avoid emitting a
|
* elf32-arm.c (elf32_arm_final_link_relocate): Avoid emitting a
|
||||||
|
@ -3921,13 +3921,11 @@ ppc_elf_check_relocs (bfd *abfd,
|
|||||||
if (isym == NULL)
|
if (isym == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
|
if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
|
||||||
&& (!info->shared
|
|
||||||
|| is_branch_reloc (r_type)))
|
|
||||||
{
|
{
|
||||||
struct plt_entry **ifunc;
|
struct plt_entry **ifunc;
|
||||||
bfd_vma addend;
|
|
||||||
|
|
||||||
|
/* Set PLT_IFUNC flag for this sym, no GOT entry yet. */
|
||||||
ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
|
ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
|
||||||
PLT_IFUNC);
|
PLT_IFUNC);
|
||||||
if (ifunc == NULL)
|
if (ifunc == NULL)
|
||||||
@ -3936,7 +3934,10 @@ ppc_elf_check_relocs (bfd *abfd,
|
|||||||
/* STT_GNU_IFUNC symbols must have a PLT entry;
|
/* STT_GNU_IFUNC symbols must have a PLT entry;
|
||||||
In a non-pie executable even when there are
|
In a non-pie executable even when there are
|
||||||
no plt calls. */
|
no plt calls. */
|
||||||
addend = 0;
|
if (!info->shared
|
||||||
|
|| is_branch_reloc (r_type))
|
||||||
|
{
|
||||||
|
bfd_vma addend = 0;
|
||||||
if (r_type == R_PPC_PLTREL24)
|
if (r_type == R_PPC_PLTREL24)
|
||||||
{
|
{
|
||||||
ppc_elf_tdata (abfd)->makes_plt_call = 1;
|
ppc_elf_tdata (abfd)->makes_plt_call = 1;
|
||||||
@ -3947,6 +3948,7 @@ ppc_elf_check_relocs (bfd *abfd,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!htab->is_vxworks
|
if (!htab->is_vxworks
|
||||||
&& is_branch_reloc (r_type)
|
&& is_branch_reloc (r_type)
|
||||||
@ -5901,6 +5903,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||||||
|| eh->elf.root.type != bfd_link_hash_undefweak))
|
|| eh->elf.root.type != bfd_link_hash_undefweak))
|
||||||
{
|
{
|
||||||
asection *rsec = htab->relgot;
|
asection *rsec = htab->relgot;
|
||||||
|
|
||||||
|
if (eh->elf.type == STT_GNU_IFUNC)
|
||||||
|
rsec = htab->reliplt;
|
||||||
/* All the entries we allocated need relocs.
|
/* All the entries we allocated need relocs.
|
||||||
Except LD only needs one. */
|
Except LD only needs one. */
|
||||||
if ((eh->tls_mask & TLS_LD) != 0
|
if ((eh->tls_mask & TLS_LD) != 0
|
||||||
@ -6181,8 +6186,12 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||||||
{
|
{
|
||||||
*local_got = allocate_got (htab, need);
|
*local_got = allocate_got (htab, need);
|
||||||
if (info->shared)
|
if (info->shared)
|
||||||
htab->relgot->size += (need
|
{
|
||||||
* (sizeof (Elf32_External_Rela) / 4));
|
asection *srel = htab->relgot;
|
||||||
|
if ((*lgot_masks & PLT_IFUNC) != 0)
|
||||||
|
srel = htab->reliplt;
|
||||||
|
srel->size += need * (sizeof (Elf32_External_Rela) / 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -7987,6 +7996,8 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
|||||||
asection *rsec = htab->relgot;
|
asection *rsec = htab->relgot;
|
||||||
bfd_byte * loc;
|
bfd_byte * loc;
|
||||||
|
|
||||||
|
if (ifunc != NULL)
|
||||||
|
rsec = htab->reliplt;
|
||||||
outrel.r_offset = (htab->got->output_section->vma
|
outrel.r_offset = (htab->got->output_section->vma
|
||||||
+ htab->got->output_offset
|
+ htab->got->output_offset
|
||||||
+ off);
|
+ off);
|
||||||
|
Reference in New Issue
Block a user