mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
S/390: ifunc: Redirect local function calls to the IPLT.
bfd/ChangeLog: * elf32-s390.c (elf_s390_check_relocs): Set the non_got_ref marker only when linking an executable. (elf_s390_relocate_section): Redirect PC-relative relocs to a IPLT slot. * elf64-s390.c (elf_s390_check_relocs): Set the non_got_ref marker only when linking an executable. (elf_s390_relocate_section): Redirect PC-relative relocs to a IPLT slot.
This commit is contained in:
parent
d8ee9e44cc
commit
99ba512554
@ -1,3 +1,14 @@
|
|||||||
|
2015-10-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf32-s390.c (elf_s390_check_relocs): Set the non_got_ref marker
|
||||||
|
only when linking an executable.
|
||||||
|
(elf_s390_relocate_section): Redirect PC-relative relocs to a IPLT
|
||||||
|
slot.
|
||||||
|
* elf64-s390.c (elf_s390_check_relocs): Set the non_got_ref marker
|
||||||
|
only when linking an executable.
|
||||||
|
(elf_s390_relocate_section): Redirect PC-relative relocs to a IPLT
|
||||||
|
slot.
|
||||||
|
|
||||||
2015-10-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
2015-10-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* elf32-s390.c (elf_s390_adjust_dynamic_symbol): Set the PLT
|
* elf32-s390.c (elf_s390_adjust_dynamic_symbol): Set the PLT
|
||||||
|
@ -1272,7 +1272,7 @@ elf_s390_check_relocs (bfd *abfd,
|
|||||||
case R_390_PC24DBL:
|
case R_390_PC24DBL:
|
||||||
case R_390_PC32DBL:
|
case R_390_PC32DBL:
|
||||||
case R_390_PC32:
|
case R_390_PC32:
|
||||||
if (h != NULL)
|
if (h != NULL && bfd_link_executable (info))
|
||||||
{
|
{
|
||||||
/* If this reloc is in a read-only section, we might
|
/* If this reloc is in a read-only section, we might
|
||||||
need a copy reloc. We can't check reliably at this
|
need a copy reloc. We can't check reliably at this
|
||||||
@ -2776,15 +2776,35 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
unresolved_reloc = FALSE;
|
unresolved_reloc = FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_390_8:
|
|
||||||
case R_390_16:
|
|
||||||
case R_390_32:
|
|
||||||
case R_390_PC16:
|
case R_390_PC16:
|
||||||
case R_390_PC12DBL:
|
case R_390_PC12DBL:
|
||||||
case R_390_PC16DBL:
|
case R_390_PC16DBL:
|
||||||
case R_390_PC24DBL:
|
case R_390_PC24DBL:
|
||||||
case R_390_PC32DBL:
|
case R_390_PC32DBL:
|
||||||
case R_390_PC32:
|
case R_390_PC32:
|
||||||
|
if (h != NULL
|
||||||
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
|
&& h->def_regular
|
||||||
|
&& !bfd_link_executable (info))
|
||||||
|
{
|
||||||
|
/* This will not work our if the function does not
|
||||||
|
happen to set up the GOT pointer for some other
|
||||||
|
reason. 31 bit PLT entries require r12 to hold the
|
||||||
|
GOT pointer.
|
||||||
|
FIXME: Implement an errorcheck.
|
||||||
|
NOTE: It will work when brasl is not available
|
||||||
|
(e.g. with -m31 -march=g5) since a local function
|
||||||
|
call then does use GOTOFF which implies r12 being set
|
||||||
|
up. */
|
||||||
|
relocation = (htab->elf.iplt->output_section->vma
|
||||||
|
+ htab->elf.iplt->output_offset
|
||||||
|
+ h ->plt.offset);
|
||||||
|
goto do_relocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
case R_390_8:
|
||||||
|
case R_390_16:
|
||||||
|
case R_390_32:
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& s390_is_ifunc_symbol_p (h)
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
&& h->def_regular)
|
&& h->def_regular)
|
||||||
|
@ -1205,7 +1205,7 @@ elf_s390_check_relocs (bfd *abfd,
|
|||||||
case R_390_PC32:
|
case R_390_PC32:
|
||||||
case R_390_PC32DBL:
|
case R_390_PC32DBL:
|
||||||
case R_390_PC64:
|
case R_390_PC64:
|
||||||
if (h != NULL)
|
if (h != NULL && bfd_link_executable (info))
|
||||||
{
|
{
|
||||||
/* If this reloc is in a read-only section, we might
|
/* If this reloc is in a read-only section, we might
|
||||||
need a copy reloc. We can't check reliably at this
|
need a copy reloc. We can't check reliably at this
|
||||||
@ -2718,10 +2718,6 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
unresolved_reloc = FALSE;
|
unresolved_reloc = FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_390_8:
|
|
||||||
case R_390_16:
|
|
||||||
case R_390_32:
|
|
||||||
case R_390_64:
|
|
||||||
case R_390_PC16:
|
case R_390_PC16:
|
||||||
case R_390_PC12DBL:
|
case R_390_PC12DBL:
|
||||||
case R_390_PC16DBL:
|
case R_390_PC16DBL:
|
||||||
@ -2729,6 +2725,24 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
case R_390_PC32:
|
case R_390_PC32:
|
||||||
case R_390_PC32DBL:
|
case R_390_PC32DBL:
|
||||||
case R_390_PC64:
|
case R_390_PC64:
|
||||||
|
/* The target of these relocs are instruction operands
|
||||||
|
residing in read-only sections. We cannot emit a runtime
|
||||||
|
reloc for it. */
|
||||||
|
if (h != NULL
|
||||||
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
|
&& h->def_regular
|
||||||
|
&& bfd_link_pic (info))
|
||||||
|
{
|
||||||
|
relocation = (htab->elf.iplt->output_section->vma
|
||||||
|
+ htab->elf.iplt->output_offset
|
||||||
|
+ h->plt.offset);
|
||||||
|
goto do_relocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
case R_390_8:
|
||||||
|
case R_390_16:
|
||||||
|
case R_390_32:
|
||||||
|
case R_390_64:
|
||||||
|
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& s390_is_ifunc_symbol_p (h)
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
|
Loading…
Reference in New Issue
Block a user