From 31db78f6a33ede3527772025eabf73373638077c Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Mon, 3 Sep 2012 12:03:48 +0000 Subject: [PATCH] 2012-09-03 Andreas Krebbel * elf32-s390.c (elf_s390_relocate_section): Handle PLTOFF for local and global ifunc symbols. * elf64-s390.c (elf_s390_relocate_section): Likewise. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-s390.c | 8 ++++++-- bfd/elf64-s390.c | 11 ++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ee99372..189d52d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2012-09-03 Andreas Krebbel + + * elf32-s390.c (elf_s390_relocate_section): Handle PLTOFF for + local and global ifunc symbols. + * elf64-s390.c (elf_s390_relocate_section): Likewise. + 2012-09-02 H.J. Lu * elf-bfd.h (elf_link_hash_table): Add hdynamic for the diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 039de3a..d6eedfa 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -2349,6 +2349,10 @@ elf_s390_relocate_section (bfd *output_bfd, switch (r_type) { + case R_390_PLTOFF16: + case R_390_PLTOFF32: + relocation -= htab->elf.sgot->output_section->vma; + break; case R_390_GOTPLT12: case R_390_GOTPLT16: case R_390_GOTPLT20: @@ -2625,9 +2629,9 @@ elf_s390_relocate_section (bfd *output_bfd, /* For local symbols or if we didn't make a PLT entry for this symbol resolve the symbol directly. */ - if ( h == NULL + if (h == NULL || h->plt.offset == (bfd_vma) -1 - || htab->elf.splt == NULL) + || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h))) { relocation -= htab->elf.sgot->output_section->vma; break; diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index c8b57f4..19926c6 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -2306,6 +2306,11 @@ elf_s390_relocate_section (bfd *output_bfd, switch (r_type) { + case R_390_PLTOFF16: + case R_390_PLTOFF32: + case R_390_PLTOFF64: + relocation -= htab->elf.sgot->output_section->vma; + break; case R_390_GOTPLT12: case R_390_GOTPLT16: case R_390_GOTPLT20: @@ -2561,7 +2566,7 @@ elf_s390_relocate_section (bfd *output_bfd, break; if (h->plt.offset == (bfd_vma) -1 - || (htab->elf.splt == NULL && htab->elf.iplt == NULL)) + || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h))) { /* We didn't make a PLT entry for this symbol. This happens when statically linking PIC code, or when @@ -2587,9 +2592,9 @@ elf_s390_relocate_section (bfd *output_bfd, /* For local symbols or if we didn't make a PLT entry for this symbol resolve the symbol directly. */ - if ( h == NULL + if (h == NULL || h->plt.offset == (bfd_vma) -1 - || htab->elf.splt == NULL) + || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h))) { relocation -= htab->elf.sgot->output_section->vma; break; -- 2.7.4