Linux: Use ptrdiff_t for __rseq_offset

Message ID 87iltxxqeh.fsf@oldenburg.str.redhat.com
State Committed
Commit 6c33b018438ee799c29486f21d43d8100bdbd597
Headers
Series Linux: Use ptrdiff_t for __rseq_offset |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Florian Weimer Feb. 2, 2022, 3:02 p.m. UTC
  This matches the data size initial-exec relocations use on most
targets.

Tested on armv7hl-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
s390x-linux-gnu, x86_64-linux-gnu.  Built with build many-glibcs.py.

---
 manual/threads.texi                                     | 2 +-
 sysdeps/nptl/dl-tls_init_tp.c                           | 4 ++--
 sysdeps/unix/sysv/linux/aarch64/ld.abilist              | 2 +-
 sysdeps/unix/sysv/linux/alpha/ld.abilist                | 2 +-
 sysdeps/unix/sysv/linux/ia64/ld.abilist                 | 2 +-
 sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist      | 2 +-
 sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist | 2 +-
 sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist | 2 +-
 sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist           | 2 +-
 sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist         | 2 +-
 sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist        | 2 +-
 sysdeps/unix/sysv/linux/sys/rseq.h                      | 3 ++-
 sysdeps/unix/sysv/linux/x86_64/64/ld.abilist            | 2 +-
 13 files changed, 15 insertions(+), 14 deletions(-)
  

Comments

Mathieu Desnoyers Feb. 2, 2022, 4:06 p.m. UTC | #1
----- On Feb 2, 2022, at 10:02 AM, Florian Weimer fweimer@redhat.com wrote:

> This matches the data size initial-exec relocations use on most
> targets.
> 
> Tested on armv7hl-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
> s390x-linux-gnu, x86_64-linux-gnu.  Built with build many-glibcs.py.

Thanks!

Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

> 
> ---
> manual/threads.texi                                     | 2 +-
> sysdeps/nptl/dl-tls_init_tp.c                           | 4 ++--
> sysdeps/unix/sysv/linux/aarch64/ld.abilist              | 2 +-
> sysdeps/unix/sysv/linux/alpha/ld.abilist                | 2 +-
> sysdeps/unix/sysv/linux/ia64/ld.abilist                 | 2 +-
> sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist      | 2 +-
> sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist | 2 +-
> sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist | 2 +-
> sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist           | 2 +-
> sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist         | 2 +-
> sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist        | 2 +-
> sysdeps/unix/sysv/linux/sys/rseq.h                      | 3 ++-
> sysdeps/unix/sysv/linux/x86_64/64/ld.abilist            | 2 +-
> 13 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/manual/threads.texi b/manual/threads.texi
> index 4869f69d2c..48fd562923 100644
> --- a/manual/threads.texi
> +++ b/manual/threads.texi
> @@ -1004,7 +1004,7 @@ The manual for the @code{rseq} system call can be found
> at
> @uref{https://git.kernel.org/pub/scm/libs/librseq/librseq.git/tree/doc/man/rseq.2}.
> @end deftp
> 
> -@deftypevar {int} __rseq_offset
> +@deftypevar {ptrdiff_t} __rseq_offset
> @standards{Linux, sys/rseq.h}
> This variable contains the offset between the thread pointer (as defined
> by @code{__builtin_thread_pointer} or the thread pointer register for
> diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c
> index 531a065ed7..1294c91816 100644
> --- a/sysdeps/nptl/dl-tls_init_tp.c
> +++ b/sysdeps/nptl/dl-tls_init_tp.c
> @@ -46,7 +46,7 @@ rtld_mutex_dummy (pthread_mutex_t *lock)
> 
> const unsigned int __rseq_flags;
> const unsigned int __rseq_size attribute_relro;
> -const int __rseq_offset attribute_relro;
> +const ptrdiff_t __rseq_offset attribute_relro;
> 
> void
> __tls_pre_init_tp (void)
> @@ -119,7 +119,7 @@ __tls_init_tp (void)
>        all targets support __thread_pointer, so set __rseq_offset only
>        if thre rseq registration may have happened because RSEQ_SIG is
>        defined.  */
> -    extern int offset __asm__ ("__rseq_offset");
> +    extern ptrdiff_t offset __asm__ ("__rseq_offset");
>     offset = (char *) &pd->rseq_area - (char *) __thread_pointer ();
> #endif
>   }
> diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> index bf4d4f9b6f..5151c0781d 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> @@ -5,5 +5,5 @@ GLIBC_2.17 _dl_mcount F
> GLIBC_2.17 _r_debug D 0x28
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/alpha/ld.abilist
> b/sysdeps/unix/sysv/linux/alpha/ld.abilist
> index a23325a566..3e296c5473 100644
> --- a/sysdeps/unix/sysv/linux/alpha/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/ld.abilist
> @@ -4,6 +4,6 @@ GLIBC_2.1 _dl_mcount F
> GLIBC_2.3 __tls_get_addr F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> GLIBC_2.4 __stack_chk_guard D 0x8
> diff --git a/sysdeps/unix/sysv/linux/ia64/ld.abilist
> b/sysdeps/unix/sysv/linux/ia64/ld.abilist
> index 8ccb5be911..5471b24d59 100644
> --- a/sysdeps/unix/sysv/linux/ia64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
> GLIBC_2.3 __tls_get_addr F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> index 37a47ebc0a..f26e594a13 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> @@ -4,6 +4,6 @@ GLIBC_2.2 _dl_mcount F
> GLIBC_2.3 __tls_get_addr F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> GLIBC_2.4 __stack_chk_guard D 0x8
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> index da24dc7fb5..21f472e674 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> @@ -6,5 +6,5 @@ GLIBC_2.3 _dl_mcount F
> GLIBC_2.3 _r_debug D 0x28
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> index b9ae89ae8d..9c9c40450d 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> @@ -6,5 +6,5 @@ GLIBC_2.22 __tls_get_addr_opt F
> GLIBC_2.23 __parse_hwcap_and_convert_at_platform F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> index 48431c91a9..a7758a0e52 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> @@ -5,5 +5,5 @@ GLIBC_2.27 _dl_mcount F
> GLIBC_2.27 _r_debug D 0x28
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> index 117d1430a4..78d071600b 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
> GLIBC_2.3 __tls_get_offset F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> index 8ccb5be911..5471b24d59 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
> GLIBC_2.3 __tls_get_addr F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
> GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/sys/rseq.h
> b/sysdeps/unix/sysv/linux/sys/rseq.h
> index db6c3cebf1..8533782cf4 100644
> --- a/sysdeps/unix/sysv/linux/sys/rseq.h
> +++ b/sysdeps/unix/sysv/linux/sys/rseq.h
> @@ -21,6 +21,7 @@
> /* Architecture-specific rseq signature.  */
> #include <bits/rseq.h>
> 
> +#include <stddef.h>
> #include <stdint.h>
> #include <sys/cdefs.h>
> #include <bits/endian.h>
> @@ -172,7 +173,7 @@ struct rseq
> #endif /* __GLIBC_HAVE_KERNEL_RSEQ */
> 
> /* Offset from the thread pointer to the rseq area.  */
> -extern const int __rseq_offset;
> +extern const ptrdiff_t __rseq_offset;
> 
> /* Size of the registered rseq area.  0 if the registration was
>    unsuccessful.  */
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> index ae622bdf97..5a8bd322cd 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2.5 _r_debug D 0x28
> GLIBC_2.3 __tls_get_addr F
> GLIBC_2.34 __rtld_version_placeholder F
> GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8
>  GLIBC_2.35 __rseq_size D 0x4
  
Carlos O'Donell Feb. 2, 2022, 9:30 p.m. UTC | #2
On 2/2/22 10:02, Florian Weimer wrote:
> This matches the data size initial-exec relocations use on most
> targets.

On the 64-bit arches this doubles the size of the data type allowing it to
support a true pointer difference.

I reviewed the offset relocs as part of this review, since those offsets would
be used to generate the offset from the thread pointer in TLS IE mode for the
compiler generated code.

I went to binutils to verify these directly in the linker design:

R_AARCH64_* - Varies by -mtls-size up to 48-bits, and the compiler influences this.
  - And the compiler comments indicate this *should* have been a max of 64-bits.
R_ALPHA_TPREL64 - 64-bits (binutils/bfd/elf64-alpha.c)
R_IA_64_TPREL64LSB - 32-bits (binutils/bfd/elfxx-ia64.c) *** Old design.
R_MIPS_TLS_TPREL64 - 64-bits (binutils/bfd/elfxx-mips.c)
R_PPC64_TPREL64 - 64-bits (binutils/bfd/elf64-ppc.c)
R_RISCV_TLS_TPREL64 - 64-bits (binutils/bfd/elfxx-riscv.c)
R_390_TLS_TPOFF - 64-bits (binutils/bfd/elf64-s390.c)
R_SPARC_TLSTPOFF64 - 64-bits (binutils/bfd/elfxx-sparc.c)
R_X86_64_TPOFF64 - 64-bits (binutils/bfd/elf64-x86-64.c)

And indeed it looks like these generally match the requirement to have ptrdiff_t
as the public ABI.

> Tested on armv7hl-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
> s390x-linux-gnu, x86_64-linux-gnu.  Built with build many-glibcs.py.

This looks good to me. OK for glibc 2.35. Please push.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
 
> ---
>  manual/threads.texi                                     | 2 +-
>  sysdeps/nptl/dl-tls_init_tp.c                           | 4 ++--
>  sysdeps/unix/sysv/linux/aarch64/ld.abilist              | 2 +-
>  sysdeps/unix/sysv/linux/alpha/ld.abilist                | 2 +-
>  sysdeps/unix/sysv/linux/ia64/ld.abilist                 | 2 +-
>  sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist      | 2 +-
>  sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist | 2 +-
>  sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist | 2 +-
>  sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist           | 2 +-
>  sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist         | 2 +-
>  sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist        | 2 +-
>  sysdeps/unix/sysv/linux/sys/rseq.h                      | 3 ++-
>  sysdeps/unix/sysv/linux/x86_64/64/ld.abilist            | 2 +-
>  13 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/manual/threads.texi b/manual/threads.texi
> index 4869f69d2c..48fd562923 100644
> --- a/manual/threads.texi
> +++ b/manual/threads.texi
> @@ -1004,7 +1004,7 @@ The manual for the @code{rseq} system call can be found
>  at @uref{https://git.kernel.org/pub/scm/libs/librseq/librseq.git/tree/doc/man/rseq.2}.
>  @end deftp
>  
> -@deftypevar {int} __rseq_offset
> +@deftypevar {ptrdiff_t} __rseq_offset

OK.

>  @standards{Linux, sys/rseq.h}
>  This variable contains the offset between the thread pointer (as defined
>  by @code{__builtin_thread_pointer} or the thread pointer register for
> diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c
> index 531a065ed7..1294c91816 100644
> --- a/sysdeps/nptl/dl-tls_init_tp.c
> +++ b/sysdeps/nptl/dl-tls_init_tp.c
> @@ -46,7 +46,7 @@ rtld_mutex_dummy (pthread_mutex_t *lock)
>  
>  const unsigned int __rseq_flags;
>  const unsigned int __rseq_size attribute_relro;
> -const int __rseq_offset attribute_relro;
> +const ptrdiff_t __rseq_offset attribute_relro;

OK.

>  
>  void
>  __tls_pre_init_tp (void)
> @@ -119,7 +119,7 @@ __tls_init_tp (void)
>         all targets support __thread_pointer, so set __rseq_offset only
>         if thre rseq registration may have happened because RSEQ_SIG is
>         defined.  */
> -    extern int offset __asm__ ("__rseq_offset");
> +    extern ptrdiff_t offset __asm__ ("__rseq_offset");

OK.

>      offset = (char *) &pd->rseq_area - (char *) __thread_pointer ();
>  #endif
>    }
> diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> index bf4d4f9b6f..5151c0781d 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
> @@ -5,5 +5,5 @@ GLIBC_2.17 _dl_mcount F
>  GLIBC_2.17 _r_debug D 0x28
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/alpha/ld.abilist b/sysdeps/unix/sysv/linux/alpha/ld.abilist
> index a23325a566..3e296c5473 100644
> --- a/sysdeps/unix/sysv/linux/alpha/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/ld.abilist
> @@ -4,6 +4,6 @@ GLIBC_2.1 _dl_mcount F
>  GLIBC_2.3 __tls_get_addr F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
>  GLIBC_2.4 __stack_chk_guard D 0x8
> diff --git a/sysdeps/unix/sysv/linux/ia64/ld.abilist b/sysdeps/unix/sysv/linux/ia64/ld.abilist
> index 8ccb5be911..5471b24d59 100644
> --- a/sysdeps/unix/sysv/linux/ia64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
>  GLIBC_2.3 __tls_get_addr F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> index 37a47ebc0a..f26e594a13 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
> @@ -4,6 +4,6 @@ GLIBC_2.2 _dl_mcount F
>  GLIBC_2.3 __tls_get_addr F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
>  GLIBC_2.4 __stack_chk_guard D 0x8
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> index da24dc7fb5..21f472e674 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
> @@ -6,5 +6,5 @@ GLIBC_2.3 _dl_mcount F
>  GLIBC_2.3 _r_debug D 0x28
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> index b9ae89ae8d..9c9c40450d 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
> @@ -6,5 +6,5 @@ GLIBC_2.22 __tls_get_addr_opt F
>  GLIBC_2.23 __parse_hwcap_and_convert_at_platform F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> index 48431c91a9..a7758a0e52 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
> @@ -5,5 +5,5 @@ GLIBC_2.27 _dl_mcount F
>  GLIBC_2.27 _r_debug D 0x28
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> index 117d1430a4..78d071600b 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
>  GLIBC_2.3 __tls_get_offset F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> index 8ccb5be911..5471b24d59 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2 _r_debug D 0x28
>  GLIBC_2.3 __tls_get_addr F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
> diff --git a/sysdeps/unix/sysv/linux/sys/rseq.h b/sysdeps/unix/sysv/linux/sys/rseq.h
> index db6c3cebf1..8533782cf4 100644
> --- a/sysdeps/unix/sysv/linux/sys/rseq.h
> +++ b/sysdeps/unix/sysv/linux/sys/rseq.h
> @@ -21,6 +21,7 @@
>  /* Architecture-specific rseq signature.  */
>  #include <bits/rseq.h>
>  
> +#include <stddef.h>

OK.

>  #include <stdint.h>
>  #include <sys/cdefs.h>
>  #include <bits/endian.h>
> @@ -172,7 +173,7 @@ struct rseq
>  #endif /* __GLIBC_HAVE_KERNEL_RSEQ */
>  
>  /* Offset from the thread pointer to the rseq area.  */
> -extern const int __rseq_offset;
> +extern const ptrdiff_t __rseq_offset;

OK.

>  
>  /* Size of the registered rseq area.  0 if the registration was
>     unsuccessful.  */
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> index ae622bdf97..5a8bd322cd 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
> @@ -4,5 +4,5 @@ GLIBC_2.2.5 _r_debug D 0x28
>  GLIBC_2.3 __tls_get_addr F
>  GLIBC_2.34 __rtld_version_placeholder F
>  GLIBC_2.35 __rseq_flags D 0x4
> -GLIBC_2.35 __rseq_offset D 0x4
> +GLIBC_2.35 __rseq_offset D 0x8

OK.

>  GLIBC_2.35 __rseq_size D 0x4
>
  

Patch

diff --git a/manual/threads.texi b/manual/threads.texi
index 4869f69d2c..48fd562923 100644
--- a/manual/threads.texi
+++ b/manual/threads.texi
@@ -1004,7 +1004,7 @@  The manual for the @code{rseq} system call can be found
 at @uref{https://git.kernel.org/pub/scm/libs/librseq/librseq.git/tree/doc/man/rseq.2}.
 @end deftp
 
-@deftypevar {int} __rseq_offset
+@deftypevar {ptrdiff_t} __rseq_offset
 @standards{Linux, sys/rseq.h}
 This variable contains the offset between the thread pointer (as defined
 by @code{__builtin_thread_pointer} or the thread pointer register for
diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c
index 531a065ed7..1294c91816 100644
--- a/sysdeps/nptl/dl-tls_init_tp.c
+++ b/sysdeps/nptl/dl-tls_init_tp.c
@@ -46,7 +46,7 @@  rtld_mutex_dummy (pthread_mutex_t *lock)
 
 const unsigned int __rseq_flags;
 const unsigned int __rseq_size attribute_relro;
-const int __rseq_offset attribute_relro;
+const ptrdiff_t __rseq_offset attribute_relro;
 
 void
 __tls_pre_init_tp (void)
@@ -119,7 +119,7 @@  __tls_init_tp (void)
        all targets support __thread_pointer, so set __rseq_offset only
        if thre rseq registration may have happened because RSEQ_SIG is
        defined.  */
-    extern int offset __asm__ ("__rseq_offset");
+    extern ptrdiff_t offset __asm__ ("__rseq_offset");
     offset = (char *) &pd->rseq_area - (char *) __thread_pointer ();
 #endif
   }
diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
index bf4d4f9b6f..5151c0781d 100644
--- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist
@@ -5,5 +5,5 @@  GLIBC_2.17 _dl_mcount F
 GLIBC_2.17 _r_debug D 0x28
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/alpha/ld.abilist b/sysdeps/unix/sysv/linux/alpha/ld.abilist
index a23325a566..3e296c5473 100644
--- a/sysdeps/unix/sysv/linux/alpha/ld.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/ld.abilist
@@ -4,6 +4,6 @@  GLIBC_2.1 _dl_mcount F
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
 GLIBC_2.4 __stack_chk_guard D 0x8
diff --git a/sysdeps/unix/sysv/linux/ia64/ld.abilist b/sysdeps/unix/sysv/linux/ia64/ld.abilist
index 8ccb5be911..5471b24d59 100644
--- a/sysdeps/unix/sysv/linux/ia64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/ld.abilist
@@ -4,5 +4,5 @@  GLIBC_2.2 _r_debug D 0x28
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
index 37a47ebc0a..f26e594a13 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist
@@ -4,6 +4,6 @@  GLIBC_2.2 _dl_mcount F
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
 GLIBC_2.4 __stack_chk_guard D 0x8
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
index da24dc7fb5..21f472e674 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
@@ -6,5 +6,5 @@  GLIBC_2.3 _dl_mcount F
 GLIBC_2.3 _r_debug D 0x28
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
index b9ae89ae8d..9c9c40450d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
@@ -6,5 +6,5 @@  GLIBC_2.22 __tls_get_addr_opt F
 GLIBC_2.23 __parse_hwcap_and_convert_at_platform F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
index 48431c91a9..a7758a0e52 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist
@@ -5,5 +5,5 @@  GLIBC_2.27 _dl_mcount F
 GLIBC_2.27 _r_debug D 0x28
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
index 117d1430a4..78d071600b 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist
@@ -4,5 +4,5 @@  GLIBC_2.2 _r_debug D 0x28
 GLIBC_2.3 __tls_get_offset F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
index 8ccb5be911..5471b24d59 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist
@@ -4,5 +4,5 @@  GLIBC_2.2 _r_debug D 0x28
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
diff --git a/sysdeps/unix/sysv/linux/sys/rseq.h b/sysdeps/unix/sysv/linux/sys/rseq.h
index db6c3cebf1..8533782cf4 100644
--- a/sysdeps/unix/sysv/linux/sys/rseq.h
+++ b/sysdeps/unix/sysv/linux/sys/rseq.h
@@ -21,6 +21,7 @@ 
 /* Architecture-specific rseq signature.  */
 #include <bits/rseq.h>
 
+#include <stddef.h>
 #include <stdint.h>
 #include <sys/cdefs.h>
 #include <bits/endian.h>
@@ -172,7 +173,7 @@  struct rseq
 #endif /* __GLIBC_HAVE_KERNEL_RSEQ */
 
 /* Offset from the thread pointer to the rseq area.  */
-extern const int __rseq_offset;
+extern const ptrdiff_t __rseq_offset;
 
 /* Size of the registered rseq area.  0 if the registration was
    unsuccessful.  */
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
index ae622bdf97..5a8bd322cd 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
@@ -4,5 +4,5 @@  GLIBC_2.2.5 _r_debug D 0x28
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
-GLIBC_2.35 __rseq_offset D 0x4
+GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4