From: Stefan Schulze Frielinghaus Date: Tue, 10 Jan 2023 13:34:16 +0000 (+0100) Subject: IBM zSystems: Fix offset relative to static TLS X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aefebe82dc89711384b85329daa48d04c1d3a45b;p=binutils-gdb.git IBM zSystems: Fix offset relative to static TLS For local exec TLS relocations of the form foo@NTPOFF+x the addend was ignored. bfd/ChangeLog: * elf32-s390.c (elf_s390_relocate_section): Honor addend for R_390_TLS_LE32. * elf64-s390.c (elf_s390_relocate_section): Honor addend for R_390_TLS_LE64. ld/ChangeLog: * testsuite/ld-s390/reloctlsle-1.d: New test. * testsuite/ld-s390/reloctlsle-1.s: New test. --- diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 061307d6c3b..9496b1472d6 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -2706,7 +2706,7 @@ elf_s390_relocate_section (bfd *output_bfd, /* This relocation gets optimized away by the local exec access optimization. */ BFD_ASSERT (! unresolved_reloc); - bfd_put_32 (output_bfd, -tpoff (info, relocation), + bfd_put_32 (output_bfd, -tpoff (info, relocation) + rel->r_addend, contents + rel->r_offset); continue; } @@ -2901,7 +2901,7 @@ elf_s390_relocate_section (bfd *output_bfd, else { BFD_ASSERT (! unresolved_reloc); - bfd_put_32 (output_bfd, -tpoff (info, relocation), + bfd_put_32 (output_bfd, -tpoff (info, relocation) + rel->r_addend, contents + rel->r_offset); } continue; diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 5279660f8f5..bcf59032c41 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -2714,7 +2714,7 @@ elf_s390_relocate_section (bfd *output_bfd, /* This relocation gets optimized away by the local exec access optimization. */ BFD_ASSERT (! unresolved_reloc); - bfd_put_64 (output_bfd, -tpoff (info, relocation), + bfd_put_64 (output_bfd, -tpoff (info, relocation) + rel->r_addend, contents + rel->r_offset); continue; } @@ -2907,7 +2907,7 @@ elf_s390_relocate_section (bfd *output_bfd, else { BFD_ASSERT (! unresolved_reloc); - bfd_put_64 (output_bfd, -tpoff (info, relocation), + bfd_put_64 (output_bfd, -tpoff (info, relocation) + rel->r_addend, contents + rel->r_offset); } continue; diff --git a/ld/testsuite/ld-s390/reloctlsle-1.d b/ld/testsuite/ld-s390/reloctlsle-1.d new file mode 100644 index 00000000000..a24c3d60c25 --- /dev/null +++ b/ld/testsuite/ld-s390/reloctlsle-1.d @@ -0,0 +1,6 @@ +#as: -m64 -mzarch -march=z900 +#ld: -m elf64_s390 -static +#readelf: -x .data + +Hex dump of section '.data': + 0x[0-9a-f]+ ffffffff fffffff0 ffffffff fffffff8 ................ diff --git a/ld/testsuite/ld-s390/reloctlsle-1.s b/ld/testsuite/ld-s390/reloctlsle-1.s new file mode 100644 index 00000000000..c8f351dd6e6 --- /dev/null +++ b/ld/testsuite/ld-s390/reloctlsle-1.s @@ -0,0 +1,14 @@ + .text + .globl _start +_start: + larl %r0,bar + + .section .tbss,"awT",@nobits + .align 8 +foo: .zero 8 + .zero 8 + + .data + .align 8 + .quad foo@NTPOFF +bar: .quad foo@NTPOFF+8