diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-11-19 11:10:06 +0100 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-11-19 11:10:06 +0100 |
commit | d47b13e0e2286ef9e9444292bc5631f43cf226da (patch) | |
tree | 8eb81d10c2575320c8681a1475efe43ab9666187 /bfd | |
parent | 56a1b672f4b97b10b093f02540dff1c855a69855 (diff) | |
download | gdb-d47b13e0e2286ef9e9444292bc5631f43cf226da.zip gdb-d47b13e0e2286ef9e9444292bc5631f43cf226da.tar.gz gdb-d47b13e0e2286ef9e9444292bc5631f43cf226da.tar.bz2 |
[S/390] Add null ptr check + port GOTOFF handling from 32 bit over to 64 bit
bfd/ChangeLog:
2015-11-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR ld/19263
* elf32-s390.c (elf_s390_gc_sweep_hook): Add null ptr check.
* elf64-s390.c (elf_s390_check_relocs): Port the GOTOFF handling
over from the 32 bit code.
(elf_s390_relocate_section): Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-s390.c | 2 | ||||
-rw-r--r-- | bfd/elf64-s390.c | 26 |
3 files changed, 32 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b580b89..87d2d90 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2015-11-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + + PR ld/19263 + * elf32-s390.c (elf_s390_gc_sweep_hook): Add null ptr check. + * elf64-s390.c (elf_s390_check_relocs): Port the GOTOFF handling + over from the 32 bit code. + (elf_s390_relocate_section): Likewise. + 2015-11-18 Alan Modra <amodra@gmail.com> PR 19256 diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 3fad6b3..8a83005 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -1531,7 +1531,7 @@ elf_s390_gc_sweep_hook (bfd *abfd, case R_390_GOTOFF16: case R_390_GOTOFF32: - if (s390_is_ifunc_symbol_p (h) && h->def_regular) + if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular) { h->plt.refcount--; break; diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index bd9c082..06f0d88 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -1040,9 +1040,6 @@ elf_s390_check_relocs (bfd *abfd, switch (r_type) { - case R_390_GOTOFF16: - case R_390_GOTOFF32: - case R_390_GOTOFF64: case R_390_GOTPC: case R_390_GOTPCDBL: /* These relocs do not need a GOT slot. They just load the @@ -1050,6 +1047,11 @@ elf_s390_check_relocs (bfd *abfd, the GOT. Since the GOT pointer has been set up above we are done. */ break; + case R_390_GOTOFF16: + case R_390_GOTOFF32: + case R_390_GOTOFF64: + if (h == NULL || !s390_is_ifunc_symbol_p (h) || !h->def_regular) + break; case R_390_PLT12DBL: case R_390_PLT16DBL: @@ -1465,6 +1467,12 @@ elf_s390_gc_sweep_hook (bfd *abfd, case R_390_GOTOFF16: case R_390_GOTOFF32: case R_390_GOTOFF64: + if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular) + { + h->plt.refcount--; + break; + } + case R_390_GOTPC: case R_390_GOTPCDBL: break; @@ -2641,6 +2649,18 @@ elf_s390_relocate_section (bfd *output_bfd, /* Relocation is relative to the start of the global offset table. */ + if (h != NULL + && s390_is_ifunc_symbol_p (h) + && h->def_regular + && !bfd_link_executable (info)) + { + relocation = (htab->elf.iplt->output_section->vma + + htab->elf.iplt->output_offset + + h->plt.offset + - htab->elf.sgot->output_section->vma); + goto do_relocation; + } + /* Note that sgot->output_offset is not involved in this calculation. We always want the start of .got. If we defined _GLOBAL_OFFSET_TABLE in a different way, as is |