aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2012-09-03 12:03:48 +0000
committerAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2012-09-03 12:03:48 +0000
commit31db78f6a33ede3527772025eabf73373638077c (patch)
treea2aae5d2d4054c0c099cd9ae8c7302f47bd553cc
parentf253d86d7f3da50f46117b753ae763dc393a13c9 (diff)
downloadgdb-31db78f6a33ede3527772025eabf73373638077c.zip
gdb-31db78f6a33ede3527772025eabf73373638077c.tar.gz
gdb-31db78f6a33ede3527772025eabf73373638077c.tar.bz2
2012-09-03 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* elf32-s390.c (elf_s390_relocate_section): Handle PLTOFF for local and global ifunc symbols. * elf64-s390.c (elf_s390_relocate_section): Likewise.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-s390.c8
-rw-r--r--bfd/elf64-s390.c11
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 <Andreas.Krebbel@de.ibm.com>
+
+ * 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 <hongjiu.lu@intel.com>
* 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;