Browse Source

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.
users/ARM/embedded-binutils-2_26-branch
Andreas Krebbel 11 years ago
parent
commit
99ba512554
  1. 11
      bfd/ChangeLog
  2. 28
      bfd/elf32-s390.c
  3. 24
      bfd/elf64-s390.c

11
bfd/ChangeLog

@ -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

28
bfd/elf32-s390.c

@ -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)

24
bfd/elf64-s390.c

@ -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)

Loading…
Cancel
Save