From: Andreas Krebbel Date: Tue, 1 Aug 2017 08:56:59 +0000 (+0200) Subject: S/390: Fix segfault when linking -shared -nostartfiles X-Git-Tag: binutils-2_29_1~101 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=080e5b3c87417937f033700896db9f50338eac5c;p=thirdparty%2Fbinutils-gdb.git S/390: Fix segfault when linking -shared -nostartfiles Regression-tested on s390x. bfd/ChangeLog: 2017-08-01 Andreas Krebbel Backport from mainline 2017-07-28 Andreas Krebbel * elf32-s390.c (elf_s390_finish_dynamic_sections): Add NULL pointer check for htab->elf.irelplt. * elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1478710263c..103334d34e0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-08-01 Andreas Krebbel + + Backport from mainline + 2017-07-28 Andreas Krebbel + + * elf32-s390.c (elf_s390_finish_dynamic_sections): Add NULL + pointer check for htab->elf.irelplt. + * elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise. + 2017-07-31 Alan Modra * elf64-ppc.c (ppc64_elf_tls_setup): Warn on --plt-localentry diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index c26bdcf900a..8adf9e47848 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -3941,7 +3941,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, break; case DT_PLTRELSZ: - dyn.d_un.d_val = htab->elf.srelplt->size + htab->elf.irelplt->size; + dyn.d_un.d_val = htab->elf.srelplt->size; + if (htab->elf.irelplt) + dyn.d_un.d_val += htab->elf.irelplt->size; break; } diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index f85f8cd7489..4dfa007cc8b 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -3745,7 +3745,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, break; case DT_PLTRELSZ: - dyn.d_un.d_val = htab->elf.srelplt->size + htab->elf.irelplt->size; + dyn.d_un.d_val = htab->elf.srelplt->size; + if (htab->elf.irelplt) + dyn.d_un.d_val += htab->elf.irelplt->size; break; case DT_RELASZ: @@ -3756,7 +3758,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, linker script arranges for .rela.plt to follow all other relocation sections, we don't have to worry about changing the DT_RELA entry. */ - dyn.d_un.d_val -= htab->elf.srelplt->size + htab->elf.irelplt->size; + dyn.d_un.d_val -= htab->elf.srelplt->size; + if (htab->elf.irelplt) + dyn.d_un.d_val -= htab->elf.irelplt->size; break; }