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:
Andreas Krebbel 2015-10-19 15:44:35 +02:00
parent d8ee9e44cc
commit 99ba512554
3 changed files with 54 additions and 9 deletions

View File

@ -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>
* elf32-s390.c (elf_s390_adjust_dynamic_symbol): Set the PLT

View File

@ -1272,7 +1272,7 @@ elf_s390_check_relocs (bfd *abfd,
case R_390_PC24DBL:
case R_390_PC32DBL:
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
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;
break;
case R_390_8:
case R_390_16:
case R_390_32:
case R_390_PC16:
case R_390_PC12DBL:
case R_390_PC16DBL:
case R_390_PC24DBL:
case R_390_PC32DBL:
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
&& s390_is_ifunc_symbol_p (h)
&& h->def_regular)

View File

@ -1205,7 +1205,7 @@ elf_s390_check_relocs (bfd *abfd,
case R_390_PC32:
case R_390_PC32DBL:
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
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;
break;
case R_390_8:
case R_390_16:
case R_390_32:
case R_390_64:
case R_390_PC16:
case R_390_PC12DBL:
case R_390_PC16DBL:
@ -2729,6 +2725,24 @@ elf_s390_relocate_section (bfd *output_bfd,
case R_390_PC32:
case R_390_PC32DBL:
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
&& s390_is_ifunc_symbol_p (h)