[2/3] Introduce <pointer_guard.h>, extracted from <sysdep.h>

Message ID b3948e223c8d9a6ba652b85f70f3ae9e89516b3b.1665663395.git.fweimer@redhat.com
State Committed
Headers
Series PTR_MANGLE/PTR_DEMANGLE refactoring |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Florian Weimer Oct. 13, 2022, 12:20 p.m. UTC
  This allows us to define a generic no-op version of PTR_MANGLE and
PTR_DEMANGLE.  In the future, we can use PTR_MANGLE and PTR_DEMANGLE
unconditionally in C sources, avoiding an unintended loss of hardening
due to missing include files or unlucky header inclusion ordering.

In i386 and x86_64, we can avoid a <tls.h> dependency in the C
code by using the computed constant from <tcb-offsets.h>.  <sysdep.h>
no longer includes these definitions, so there is no cyclic dependency
anymore when computing the <tcb-offsets.h> constants.
---
 hurd/sigunwind.c                              |  2 +-
 iconv/gconv.c                                 |  2 +-
 iconv/gconv_cache.c                           |  1 +
 iconv/gconv_db.c                              |  2 +-
 iconv/gconv_dl.c                              |  2 +-
 iconv/gconv_trans.c                           |  1 +
 iconv/skeleton.c                              |  2 +-
 inet/idna.c                                   |  1 +
 libio/iofopncook.c                            |  1 +
 libio/iofwide.c                               |  2 +-
 libio/libioP.h                                |  1 +
 libio/vtables.c                               |  1 +
 misc/unwind-link.c                            |  1 +
 nss/nss_module.c                              |  2 +-
 stdlib/cxa_atexit.c                           |  2 +-
 stdlib/cxa_finalize.c                         |  2 +-
 stdlib/cxa_thread_atexit_impl.c               |  1 +
 stdlib/exit.c                                 |  2 +-
 stdlib/on_exit.c                              |  2 +-
 sysdeps/aarch64/__longjmp.S                   |  1 +
 sysdeps/aarch64/jmpbuf-offsets.h              |  1 +
 sysdeps/aarch64/setjmp.S                      |  1 +
 sysdeps/alpha/__longjmp.S                     |  1 +
 sysdeps/alpha/jmpbuf-unwind.h                 |  1 +
 sysdeps/alpha/setjmp.S                        |  1 +
 sysdeps/arc/jmpbuf-unwind.h                   |  1 +
 sysdeps/arm/__longjmp.S                       |  1 +
 sysdeps/arm/jmpbuf-unwind.h                   |  1 +
 sysdeps/arm/pointer_guard.h                   | 67 +++++++++++++++
 sysdeps/arm/setjmp.S                          |  1 +
 sysdeps/arm/sysdep.h                          | 44 ----------
 sysdeps/csky/abiv2/__longjmp.S                |  1 +
 sysdeps/csky/abiv2/setjmp.S                   |  1 +
 sysdeps/csky/jmpbuf-unwind.h                  |  1 +
 sysdeps/generic/pointer_guard.h               | 29 +++++++
 sysdeps/generic/unwind-link.h                 |  2 +-
 sysdeps/i386/__longjmp.S                      |  1 +
 sysdeps/i386/bsd-_setjmp.S                    |  1 +
 sysdeps/i386/bsd-setjmp.S                     |  1 +
 sysdeps/i386/jmpbuf-unwind.h                  |  1 +
 sysdeps/i386/setjmp.S                         |  1 +
 sysdeps/loongarch/__longjmp.S                 |  1 +
 sysdeps/loongarch/jmpbuf-unwind.h             |  1 +
 sysdeps/loongarch/setjmp.S                    |  1 +
 sysdeps/m68k/jmpbuf-unwind.h                  |  1 +
 sysdeps/mach/hurd/i386/____longjmp_chk.S      |  1 +
 sysdeps/mach/hurd/i386/__longjmp.S            |  1 +
 sysdeps/mach/hurd/jmp-unwind.c                |  2 +-
 sysdeps/microblaze/jmpbuf-unwind.h            |  1 +
 sysdeps/mips/jmpbuf-unwind.h                  |  1 +
 sysdeps/nios2/__longjmp.S                     |  1 +
 sysdeps/nios2/jmpbuf-offsets.h                |  1 +
 sysdeps/nios2/setjmp.S                        |  1 +
 sysdeps/powerpc/jmpbuf-unwind.h               |  1 +
 sysdeps/powerpc/powerpc32/__longjmp-common.S  |  1 +
 .../powerpc/powerpc32/fpu/__longjmp-common.S  |  1 +
 sysdeps/powerpc/powerpc32/fpu/setjmp-common.S |  1 +
 sysdeps/powerpc/powerpc32/setjmp-common.S     |  1 +
 sysdeps/powerpc/powerpc64/__longjmp-common.S  |  1 +
 sysdeps/powerpc/powerpc64/setjmp-common.S     |  1 +
 sysdeps/riscv/jmpbuf-unwind.h                 |  1 +
 sysdeps/s390/jmpbuf-unwind.h                  |  1 +
 sysdeps/s390/s390-32/__longjmp.c              |  1 +
 sysdeps/s390/s390-32/setjmp.S                 |  1 +
 sysdeps/s390/s390-64/__longjmp.c              |  1 +
 sysdeps/s390/s390-64/setjmp.S                 |  1 +
 sysdeps/sh/jmpbuf-unwind.h                    |  1 +
 sysdeps/sh/sh3/__longjmp.S                    |  1 +
 sysdeps/sh/sh3/setjmp.S                       |  1 +
 sysdeps/sh/sh4/__longjmp.S                    |  1 +
 sysdeps/sh/sh4/setjmp.S                       |  1 +
 sysdeps/sparc/sparc32/__longjmp.S             |  1 +
 sysdeps/sparc/sparc32/jmpbuf-unwind.h         |  1 +
 sysdeps/sparc/sparc32/setjmp.S                |  1 +
 .../unix/sysv/linux/aarch64/pointer_guard.h   | 68 +++++++++++++++
 sysdeps/unix/sysv/linux/aarch64/sysdep.h      | 45 ----------
 .../unix/sysv/linux/alpha/____longjmp_chk.S   |  1 +
 sysdeps/unix/sysv/linux/alpha/pointer_guard.h | 62 ++++++++++++++
 sysdeps/unix/sysv/linux/alpha/sysdep.h        | 40 ---------
 sysdeps/unix/sysv/linux/arc/sysdep.h          |  4 -
 sysdeps/unix/sysv/linux/csky/pointer_guard.h  | 68 +++++++++++++++
 sysdeps/unix/sysv/linux/csky/sysdep.h         | 46 -----------
 sysdeps/unix/sysv/linux/hppa/sysdep.h         |  4 -
 .../unix/sysv/linux/i386/____longjmp_chk.S    |  1 +
 sysdeps/unix/sysv/linux/i386/pointer_guard.h  | 49 +++++++++++
 sysdeps/unix/sysv/linux/i386/sysdep.h         | 28 -------
 sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S |  1 +
 sysdeps/unix/sysv/linux/ia64/__longjmp.S      |  1 +
 sysdeps/unix/sysv/linux/ia64/pointer_guard.h  | 44 ++++++++++
 sysdeps/unix/sysv/linux/ia64/setjmp.S         |  1 +
 sysdeps/unix/sysv/linux/ia64/sysdep.h         | 20 -----
 .../unix/sysv/linux/loongarch/pointer_guard.h | 82 +++++++++++++++++++
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    | 60 --------------
 sysdeps/unix/sysv/linux/m68k/sysdep.h         |  4 -
 sysdeps/unix/sysv/linux/microblaze/sysdep.h   |  4 -
 sysdeps/unix/sysv/linux/mips/mips32/sysdep.h  |  4 -
 sysdeps/unix/sysv/linux/mips/mips64/sysdep.h  |  4 -
 sysdeps/unix/sysv/linux/nios2/pointer_guard.h | 40 +++++++++
 sysdeps/unix/sysv/linux/nios2/sysdep.h        | 17 ----
 sysdeps/unix/sysv/linux/or1k/sysdep.h         |  4 -
 .../unix/sysv/linux/powerpc/pointer_guard.h   | 55 +++++++++++++
 sysdeps/unix/sysv/linux/powerpc/sysdep.h      | 32 --------
 sysdeps/unix/sysv/linux/riscv/sysdep.h        |  4 -
 .../sysv/linux/s390/s390-32/pointer_guard.h   | 45 ++++++++++
 sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 21 -----
 .../sysv/linux/s390/s390-64/pointer_guard.h   | 47 +++++++++++
 sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 23 ------
 sysdeps/unix/sysv/linux/sh/____longjmp_chk.S  |  1 +
 sysdeps/unix/sysv/linux/sh/pointer_guard.h    | 43 ++++++++++
 sysdeps/unix/sysv/linux/sh/sysdep.h           | 19 -----
 .../linux/sparc/sparc32/____longjmp_chk.S     |  1 +
 .../sysv/linux/sparc/sparc32/pointer_guard.h  | 44 ++++++++++
 .../unix/sysv/linux/sparc/sparc32/sysdep.h    | 20 -----
 .../sysv/linux/sparc/sparc64/pointer_guard.h  | 44 ++++++++++
 .../unix/sysv/linux/sparc/sparc64/sysdep.h    | 20 -----
 .../unix/sysv/linux/x86_64/____longjmp_chk.S  |  1 +
 .../unix/sysv/linux/x86_64/pointer_guard.h    | 61 ++++++++++++++
 sysdeps/unix/sysv/linux/x86_64/sysdep.h       | 40 ---------
 sysdeps/x86_64/__longjmp.S                    |  1 +
 sysdeps/x86_64/jmpbuf-unwind.h                |  1 +
 sysdeps/x86_64/setjmp.S                       |  1 +
 sysdeps/x86_64/x32/x86-lp_size.h              |  2 +-
 wcsmbs/btowc.c                                |  2 +-
 wcsmbs/mbrtoc16.c                             |  2 +-
 wcsmbs/mbrtoc8.c                              |  2 -
 wcsmbs/mbrtowc.c                              |  2 +-
 wcsmbs/mbsnrtowcs.c                           |  2 +-
 wcsmbs/mbsrtowcs_l.c                          |  2 +-
 wcsmbs/wcrtomb.c                              |  2 +-
 wcsmbs/wcsnrtombs.c                           |  2 +-
 wcsmbs/wcsrtombs.c                            |  2 +-
 wcsmbs/wctob.c                                |  2 +-
 132 files changed, 940 insertions(+), 532 deletions(-)
 create mode 100644 sysdeps/arm/pointer_guard.h
 create mode 100644 sysdeps/generic/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/alpha/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/csky/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/i386/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/nios2/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/sh/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
 create mode 100644 sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
  

Comments

Adhemerval Zanella Netto Oct. 17, 2022, 4:13 p.m. UTC | #1
On 13/10/22 09:20, Florian Weimer via Libc-alpha wrote:
> This allows us to define a generic no-op version of PTR_MANGLE and
> PTR_DEMANGLE.  In the future, we can use PTR_MANGLE and PTR_DEMANGLE
> unconditionally in C sources, avoiding an unintended loss of hardening
> due to missing include files or unlucky header inclusion ordering.

Could we also improve the generic implementation to always XOR with the
pointer guard and move it to be a proper static inline function?  I think
we can then remove a lot of boilerplate code each architecture need to
have.

> 
> In i386 and x86_64, we can avoid a <tls.h> dependency in the C
> code by using the computed constant from <tcb-offsets.h>.  <sysdep.h>
> no longer includes these definitions, so there is no cyclic dependency
> anymore when computing the <tcb-offsets.h> constants.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


> ---
>  hurd/sigunwind.c                              |  2 +-
>  iconv/gconv.c                                 |  2 +-
>  iconv/gconv_cache.c                           |  1 +
>  iconv/gconv_db.c                              |  2 +-
>  iconv/gconv_dl.c                              |  2 +-
>  iconv/gconv_trans.c                           |  1 +
>  iconv/skeleton.c                              |  2 +-
>  inet/idna.c                                   |  1 +
>  libio/iofopncook.c                            |  1 +
>  libio/iofwide.c                               |  2 +-
>  libio/libioP.h                                |  1 +
>  libio/vtables.c                               |  1 +
>  misc/unwind-link.c                            |  1 +
>  nss/nss_module.c                              |  2 +-
>  stdlib/cxa_atexit.c                           |  2 +-
>  stdlib/cxa_finalize.c                         |  2 +-
>  stdlib/cxa_thread_atexit_impl.c               |  1 +
>  stdlib/exit.c                                 |  2 +-
>  stdlib/on_exit.c                              |  2 +-
>  sysdeps/aarch64/__longjmp.S                   |  1 +
>  sysdeps/aarch64/jmpbuf-offsets.h              |  1 +
>  sysdeps/aarch64/setjmp.S                      |  1 +
>  sysdeps/alpha/__longjmp.S                     |  1 +
>  sysdeps/alpha/jmpbuf-unwind.h                 |  1 +
>  sysdeps/alpha/setjmp.S                        |  1 +
>  sysdeps/arc/jmpbuf-unwind.h                   |  1 +
>  sysdeps/arm/__longjmp.S                       |  1 +
>  sysdeps/arm/jmpbuf-unwind.h                   |  1 +
>  sysdeps/arm/pointer_guard.h                   | 67 +++++++++++++++
>  sysdeps/arm/setjmp.S                          |  1 +
>  sysdeps/arm/sysdep.h                          | 44 ----------
>  sysdeps/csky/abiv2/__longjmp.S                |  1 +
>  sysdeps/csky/abiv2/setjmp.S                   |  1 +
>  sysdeps/csky/jmpbuf-unwind.h                  |  1 +
>  sysdeps/generic/pointer_guard.h               | 29 +++++++
>  sysdeps/generic/unwind-link.h                 |  2 +-
>  sysdeps/i386/__longjmp.S                      |  1 +
>  sysdeps/i386/bsd-_setjmp.S                    |  1 +
>  sysdeps/i386/bsd-setjmp.S                     |  1 +
>  sysdeps/i386/jmpbuf-unwind.h                  |  1 +
>  sysdeps/i386/setjmp.S                         |  1 +
>  sysdeps/loongarch/__longjmp.S                 |  1 +
>  sysdeps/loongarch/jmpbuf-unwind.h             |  1 +
>  sysdeps/loongarch/setjmp.S                    |  1 +
>  sysdeps/m68k/jmpbuf-unwind.h                  |  1 +
>  sysdeps/mach/hurd/i386/____longjmp_chk.S      |  1 +
>  sysdeps/mach/hurd/i386/__longjmp.S            |  1 +
>  sysdeps/mach/hurd/jmp-unwind.c                |  2 +-
>  sysdeps/microblaze/jmpbuf-unwind.h            |  1 +
>  sysdeps/mips/jmpbuf-unwind.h                  |  1 +
>  sysdeps/nios2/__longjmp.S                     |  1 +
>  sysdeps/nios2/jmpbuf-offsets.h                |  1 +
>  sysdeps/nios2/setjmp.S                        |  1 +
>  sysdeps/powerpc/jmpbuf-unwind.h               |  1 +
>  sysdeps/powerpc/powerpc32/__longjmp-common.S  |  1 +
>  .../powerpc/powerpc32/fpu/__longjmp-common.S  |  1 +
>  sysdeps/powerpc/powerpc32/fpu/setjmp-common.S |  1 +
>  sysdeps/powerpc/powerpc32/setjmp-common.S     |  1 +
>  sysdeps/powerpc/powerpc64/__longjmp-common.S  |  1 +
>  sysdeps/powerpc/powerpc64/setjmp-common.S     |  1 +
>  sysdeps/riscv/jmpbuf-unwind.h                 |  1 +
>  sysdeps/s390/jmpbuf-unwind.h                  |  1 +
>  sysdeps/s390/s390-32/__longjmp.c              |  1 +
>  sysdeps/s390/s390-32/setjmp.S                 |  1 +
>  sysdeps/s390/s390-64/__longjmp.c              |  1 +
>  sysdeps/s390/s390-64/setjmp.S                 |  1 +
>  sysdeps/sh/jmpbuf-unwind.h                    |  1 +
>  sysdeps/sh/sh3/__longjmp.S                    |  1 +
>  sysdeps/sh/sh3/setjmp.S                       |  1 +
>  sysdeps/sh/sh4/__longjmp.S                    |  1 +
>  sysdeps/sh/sh4/setjmp.S                       |  1 +
>  sysdeps/sparc/sparc32/__longjmp.S             |  1 +
>  sysdeps/sparc/sparc32/jmpbuf-unwind.h         |  1 +
>  sysdeps/sparc/sparc32/setjmp.S                |  1 +
>  .../unix/sysv/linux/aarch64/pointer_guard.h   | 68 +++++++++++++++
>  sysdeps/unix/sysv/linux/aarch64/sysdep.h      | 45 ----------
>  .../unix/sysv/linux/alpha/____longjmp_chk.S   |  1 +
>  sysdeps/unix/sysv/linux/alpha/pointer_guard.h | 62 ++++++++++++++
>  sysdeps/unix/sysv/linux/alpha/sysdep.h        | 40 ---------
>  sysdeps/unix/sysv/linux/arc/sysdep.h          |  4 -
>  sysdeps/unix/sysv/linux/csky/pointer_guard.h  | 68 +++++++++++++++
>  sysdeps/unix/sysv/linux/csky/sysdep.h         | 46 -----------
>  sysdeps/unix/sysv/linux/hppa/sysdep.h         |  4 -
>  .../unix/sysv/linux/i386/____longjmp_chk.S    |  1 +
>  sysdeps/unix/sysv/linux/i386/pointer_guard.h  | 49 +++++++++++
>  sysdeps/unix/sysv/linux/i386/sysdep.h         | 28 -------
>  sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S |  1 +
>  sysdeps/unix/sysv/linux/ia64/__longjmp.S      |  1 +
>  sysdeps/unix/sysv/linux/ia64/pointer_guard.h  | 44 ++++++++++
>  sysdeps/unix/sysv/linux/ia64/setjmp.S         |  1 +
>  sysdeps/unix/sysv/linux/ia64/sysdep.h         | 20 -----
>  .../unix/sysv/linux/loongarch/pointer_guard.h | 82 +++++++++++++++++++
>  sysdeps/unix/sysv/linux/loongarch/sysdep.h    | 60 --------------
>  sysdeps/unix/sysv/linux/m68k/sysdep.h         |  4 -
>  sysdeps/unix/sysv/linux/microblaze/sysdep.h   |  4 -
>  sysdeps/unix/sysv/linux/mips/mips32/sysdep.h  |  4 -
>  sysdeps/unix/sysv/linux/mips/mips64/sysdep.h  |  4 -
>  sysdeps/unix/sysv/linux/nios2/pointer_guard.h | 40 +++++++++
>  sysdeps/unix/sysv/linux/nios2/sysdep.h        | 17 ----
>  sysdeps/unix/sysv/linux/or1k/sysdep.h         |  4 -
>  .../unix/sysv/linux/powerpc/pointer_guard.h   | 55 +++++++++++++
>  sysdeps/unix/sysv/linux/powerpc/sysdep.h      | 32 --------
>  sysdeps/unix/sysv/linux/riscv/sysdep.h        |  4 -
>  .../sysv/linux/s390/s390-32/pointer_guard.h   | 45 ++++++++++
>  sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 21 -----
>  .../sysv/linux/s390/s390-64/pointer_guard.h   | 47 +++++++++++
>  sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 23 ------
>  sysdeps/unix/sysv/linux/sh/____longjmp_chk.S  |  1 +
>  sysdeps/unix/sysv/linux/sh/pointer_guard.h    | 43 ++++++++++
>  sysdeps/unix/sysv/linux/sh/sysdep.h           | 19 -----
>  .../linux/sparc/sparc32/____longjmp_chk.S     |  1 +
>  .../sysv/linux/sparc/sparc32/pointer_guard.h  | 44 ++++++++++
>  .../unix/sysv/linux/sparc/sparc32/sysdep.h    | 20 -----
>  .../sysv/linux/sparc/sparc64/pointer_guard.h  | 44 ++++++++++
>  .../unix/sysv/linux/sparc/sparc64/sysdep.h    | 20 -----
>  .../unix/sysv/linux/x86_64/____longjmp_chk.S  |  1 +
>  .../unix/sysv/linux/x86_64/pointer_guard.h    | 61 ++++++++++++++
>  sysdeps/unix/sysv/linux/x86_64/sysdep.h       | 40 ---------
>  sysdeps/x86_64/__longjmp.S                    |  1 +
>  sysdeps/x86_64/jmpbuf-unwind.h                |  1 +
>  sysdeps/x86_64/setjmp.S                       |  1 +
>  sysdeps/x86_64/x32/x86-lp_size.h              |  2 +-
>  wcsmbs/btowc.c                                |  2 +-
>  wcsmbs/mbrtoc16.c                             |  2 +-
>  wcsmbs/mbrtoc8.c                              |  2 -
>  wcsmbs/mbrtowc.c                              |  2 +-
>  wcsmbs/mbsnrtowcs.c                           |  2 +-
>  wcsmbs/mbsrtowcs_l.c                          |  2 +-
>  wcsmbs/wcrtomb.c                              |  2 +-
>  wcsmbs/wcsnrtombs.c                           |  2 +-
>  wcsmbs/wcsrtombs.c                            |  2 +-
>  wcsmbs/wctob.c                                |  2 +-
>  132 files changed, 940 insertions(+), 532 deletions(-)
>  create mode 100644 sysdeps/arm/pointer_guard.h
>  create mode 100644 sysdeps/generic/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/csky/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/i386/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/ia64/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/nios2/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/sh/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
>  create mode 100644 sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> 
> diff --git a/hurd/sigunwind.c b/hurd/sigunwind.c
> index de76cf2436..28213091e3 100644
> --- a/hurd/sigunwind.c
> +++ b/hurd/sigunwind.c
> @@ -22,7 +22,7 @@
>  #include <jmpbuf-unwind.h>
>  #include <assert.h>
>  #include <stdint.h>
> -
> +#include <pointer_guard.h>
>  
>  /* _hurd_setup_sighandler puts a link on the `active resources' chain so that
>     _longjmp_unwind will call this function with the `struct sigcontext *'
> diff --git a/iconv/gconv.c b/iconv/gconv.c
> index 62d2b37bcd..dea9c80fee 100644
> --- a/iconv/gconv.c
> +++ b/iconv/gconv.c
> @@ -23,7 +23,7 @@
>  #include <sys/param.h>
>  
>  #include <gconv_int.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  int
> diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
> index c772856d1f..5dbf596b8d 100644
> --- a/iconv/gconv_cache.c
> +++ b/iconv/gconv_cache.c
> @@ -28,6 +28,7 @@
>  #include <gconv_int.h>
>  #include <iconvconfig.h>
>  #include <not-cancel.h>
> +#include <pointer_guard.h>
>  
>  #include "../intl/hash-string.h"
>  
> diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
> index bf385ac7b1..90037fdf58 100644
> --- a/iconv/gconv_db.c
> +++ b/iconv/gconv_db.c
> @@ -27,7 +27,7 @@
>  
>  #include <dlfcn.h>
>  #include <gconv_int.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  /* Simple data structure for alias mapping.  We have two names, `from'
> diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
> index 24c0bd1d39..c93c5dd380 100644
> --- a/iconv/gconv_dl.c
> +++ b/iconv/gconv_dl.c
> @@ -26,7 +26,7 @@
>  #include <sys/param.h>
>  
>  #include <gconv_int.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  #ifdef DEBUG
> diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c
> index 1ebbbfd51b..0f4ce10996 100644
> --- a/iconv/gconv_trans.c
> +++ b/iconv/gconv_trans.c
> @@ -26,6 +26,7 @@
>  #include <libc-lock.h>
>  #include "gconv_int.h"
>  #include "../locale/localeinfo.h"
> +#include <pointer_guard.h>
>  
>  
>  int
> diff --git a/iconv/skeleton.c b/iconv/skeleton.c
> index 0356dbf92b..42ee0b6508 100644
> --- a/iconv/skeleton.c
> +++ b/iconv/skeleton.c
> @@ -147,7 +147,7 @@
>  # include <dlfcn.h>
>  #endif
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stdint.h>
>  
>  #ifndef DL_CALL_FCT
> diff --git a/inet/idna.c b/inet/idna.c
> index 9c76681c6a..df5811fd6a 100644
> --- a/inet/idna.c
> +++ b/inet/idna.c
> @@ -21,6 +21,7 @@
>  #include <inet/net-internal.h>
>  #include <netdb.h>
>  #include <stdbool.h>
> +#include <pointer_guard.h>
>  
>  /* Use the soname and version to locate libidn2, to ensure a
>     compatible ABI.  */
> diff --git a/libio/iofopncook.c b/libio/iofopncook.c
> index e108ad2199..a7db4ef1c9 100644
> --- a/libio/iofopncook.c
> +++ b/libio/iofopncook.c
> @@ -28,6 +28,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <shlib-compat.h>
> +#include <pointer_guard.h>
>  
>  static ssize_t
>  _IO_cookie_read (FILE *fp, void *buf, ssize_t size)
> diff --git a/libio/iofwide.c b/libio/iofwide.c
> index 01616e06c7..1ce685f48a 100644
> --- a/libio/iofwide.c
> +++ b/libio/iofwide.c
> @@ -36,7 +36,7 @@
>  #include <wcsmbs/wcsmbsload.h>
>  #include <iconv/gconv_int.h>
>  #include <shlib-compat.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  /* Return orientation of stream.  If mode is nonzero try to change
> diff --git a/libio/libioP.h b/libio/libioP.h
> index ba4fdbd200..dac3de73a1 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -47,6 +47,7 @@
>  #include "iolibio.h"
>  
>  #include <shlib-compat.h>
> +#include <pointer_guard.h>
>  
>  /* For historical reasons this is the name of the sysdeps header that
>     adjusts the libio configuration.  */
> diff --git a/libio/vtables.c b/libio/vtables.c
> index 50acab7f21..32459e4fac 100644
> --- a/libio/vtables.c
> +++ b/libio/vtables.c
> @@ -20,6 +20,7 @@
>  #include <libioP.h>
>  #include <stdio.h>
>  #include <ldsodefs.h>
> +#include <pointer_guard.h>
>  
>  #ifdef SHARED
>  
> diff --git a/misc/unwind-link.c b/misc/unwind-link.c
> index 9ae9561206..45b7886b46 100644
> --- a/misc/unwind-link.c
> +++ b/misc/unwind-link.c
> @@ -23,6 +23,7 @@
>  #include <gnu/lib-names.h>
>  #include <unwind-link.h>
>  #include <libc-lock.h>
> +#include <pointer_guard.h>
>  
>  /* Statically allocate the object, so that we do not have to deal with
>     malloc failure.  __libc_unwind_link_get must not fail if libgcc_s
> diff --git a/nss/nss_module.c b/nss/nss_module.c
> index f00bbd9e1a..9a8f3ddf94 100644
> --- a/nss/nss_module.c
> +++ b/nss/nss_module.c
> @@ -32,7 +32,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Suffix after .so of NSS service modules.  This is a bit of magic,
>     but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we
> diff --git a/stdlib/cxa_atexit.c b/stdlib/cxa_atexit.c
> index 1412dacb07..adf89e93f5 100644
> --- a/stdlib/cxa_atexit.c
> +++ b/stdlib/cxa_atexit.c
> @@ -21,7 +21,7 @@
>  
>  #include <libc-lock.h>
>  #include "exit.h"
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #undef __cxa_atexit
>  
> diff --git a/stdlib/cxa_finalize.c b/stdlib/cxa_finalize.c
> index d4db2e1fe0..f2479569a5 100644
> --- a/stdlib/cxa_finalize.c
> +++ b/stdlib/cxa_finalize.c
> @@ -19,7 +19,7 @@
>  #include <stdlib.h>
>  #include "exit.h"
>  #include <register-atfork.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stdint.h>
>  
>  /* If D is non-NULL, call all functions registered with `__cxa_atexit'
> diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c
> index 5cc8eb55dd..faacab3990 100644
> --- a/stdlib/cxa_thread_atexit_impl.c
> +++ b/stdlib/cxa_thread_atexit_impl.c
> @@ -75,6 +75,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <ldsodefs.h>
> +#include <pointer_guard.h>
>  
>  typedef void (*dtor_func) (void *);
>  
> diff --git a/stdlib/exit.c b/stdlib/exit.c
> index bc46109f3e..e59156bbf6 100644
> --- a/stdlib/exit.c
> +++ b/stdlib/exit.c
> @@ -18,7 +18,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <unistd.h>
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <libc-lock.h>
>  #include "exit.h"
>  
> diff --git a/stdlib/on_exit.c b/stdlib/on_exit.c
> index 3e2d640d65..fb59db20ca 100644
> --- a/stdlib/on_exit.c
> +++ b/stdlib/on_exit.c
> @@ -18,7 +18,7 @@
>  #include <assert.h>
>  #include <stdlib.h>
>  #include "exit.h"
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Register a function to be called by exit.  */
>  int
> diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S
> index 5f83f9f264..d934e00ec3 100644
> --- a/sysdeps/aarch64/__longjmp.S
> +++ b/sysdeps/aarch64/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <stap-probe.h>
>  
> diff --git a/sysdeps/aarch64/jmpbuf-offsets.h b/sysdeps/aarch64/jmpbuf-offsets.h
> index 6256bda7a9..78bdd4a539 100644
> --- a/sysdeps/aarch64/jmpbuf-offsets.h
> +++ b/sysdeps/aarch64/jmpbuf-offsets.h
> @@ -43,6 +43,7 @@
>  #include <setjmp.h>
>  #include <stdint.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  static inline uintptr_t __attribute__ ((unused))
>  _jmpbuf_sp (__jmp_buf jmpbuf)
> diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S
> index 3860f4e0ec..2ed2feb488 100644
> --- a/sysdeps/aarch64/setjmp.S
> +++ b/sysdeps/aarch64/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <stap-probe.h>
>  
> diff --git a/sysdeps/alpha/__longjmp.S b/sysdeps/alpha/__longjmp.S
> index ec7510bb55..aed7a17ed8 100644
> --- a/sysdeps/alpha/__longjmp.S
> +++ b/sysdeps/alpha/__longjmp.S
> @@ -18,6 +18,7 @@
>  #define __ASSEMBLY__
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  
> diff --git a/sysdeps/alpha/jmpbuf-unwind.h b/sysdeps/alpha/jmpbuf-unwind.h
> index 13b27990b3..318b73b100 100644
> --- a/sysdeps/alpha/jmpbuf-unwind.h
> +++ b/sysdeps/alpha/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame containing a local
>     variable at ADDRESS.  */
> diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
> index f86367ae08..deb888c072 100644
> --- a/sysdeps/alpha/setjmp.S
> +++ b/sysdeps/alpha/setjmp.S
> @@ -18,6 +18,7 @@
>  #define __ASSEMBLY__
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  	.ent __sigsetjmp
> diff --git a/sysdeps/arc/jmpbuf-unwind.h b/sysdeps/arc/jmpbuf-unwind.h
> index 5488707919..e5434a95dd 100644
> --- a/sysdeps/arc/jmpbuf-unwind.h
> +++ b/sysdeps/arc/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <jmpbuf-offsets.h>
>  #include <stdint.h>
>  #include <unwind.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S
> index 5f1cf3643f..411055b9b3 100644
> --- a/sysdeps/arm/__longjmp.S
> +++ b/sysdeps/arm/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #include <bits/setjmp.h>
>  #include <rtld-global-offsets.h>
> diff --git a/sysdeps/arm/jmpbuf-unwind.h b/sysdeps/arm/jmpbuf-unwind.h
> index e6b118f4d0..641444eaf3 100644
> --- a/sysdeps/arm/jmpbuf-unwind.h
> +++ b/sysdeps/arm/jmpbuf-unwind.h
> @@ -18,6 +18,7 @@
>  #include <setjmp.h>
>  #include <stdint.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <unwind.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame

Ok.

> diff --git a/sysdeps/arm/pointer_guard.h b/sysdeps/arm/pointer_guard.h
> new file mode 100644
> index 0000000000..6b90cec2f3
> --- /dev/null
> +++ b/sysdeps/arm/pointer_guard.h
> @@ -0,0 +1,67 @@
> +/* Pointer guard implementation.  Arm version.
> +   Copyright (C) 2013-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +/* Pointer mangling support.  */
> +#if (IS_IN (rtld) \
> +     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE_LOAD(guard, tmp)                                   \
> +  LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
> +#  define PTR_MANGLE(dst, src, guard, tmp)                              \
> +  PTR_MANGLE_LOAD(guard, tmp);                                          \
> +  PTR_MANGLE2(dst, src, guard)
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#  define PTR_MANGLE2(dst, src, guard)          \
> +  eor dst, src, guard
> +#  define PTR_DEMANGLE(dst, src, guard, tmp)    \
> +  PTR_MANGLE (dst, src, guard, tmp)
> +#  define PTR_DEMANGLE2(dst, src, guard)        \
> +  PTR_MANGLE2 (dst, src, guard)
> +# else
> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE_LOAD(guard, tmp)                                   \
> +  LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
> +#  define PTR_MANGLE(dst, src, guard, tmp)                              \
> +  PTR_MANGLE_LOAD(guard, tmp);                                          \
> +  PTR_MANGLE2(dst, src, guard)
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#  define PTR_MANGLE2(dst, src, guard)          \
> +  eor dst, src, guard
> +#  define PTR_DEMANGLE(dst, src, guard, tmp)    \
> +  PTR_MANGLE (dst, src, guard, tmp)
> +#  define PTR_DEMANGLE2(dst, src, guard)        \
> +  PTR_MANGLE2 (dst, src, guard)
> +# else
> +#  include <stdint.h>
> +extern uintptr_t __pointer_chk_guard attribute_relro;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S
> index 1c26227437..271454d769 100644
> --- a/sysdeps/arm/setjmp.S
> +++ b/sysdeps/arm/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #include <bits/setjmp.h>
>  #include <rtld-global-offsets.h>
> diff --git a/sysdeps/arm/sysdep.h b/sysdeps/arm/sysdep.h
> index f19146b85f..ffd848de88 100644
> --- a/sysdeps/arm/sysdep.h
> +++ b/sysdeps/arm/sysdep.h
> @@ -293,47 +293,3 @@
>  #else
>  # define PC_OFS  8
>  #endif
> -
> -/* Pointer mangling support.  */
> -#if (IS_IN (rtld) \
> -     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE_LOAD(guard, tmp)					\
> -  LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
> -#  define PTR_MANGLE(dst, src, guard, tmp)				\
> -  PTR_MANGLE_LOAD(guard, tmp);						\
> -  PTR_MANGLE2(dst, src, guard)
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#  define PTR_MANGLE2(dst, src, guard)		\
> -  eor dst, src, guard
> -#  define PTR_DEMANGLE(dst, src, guard, tmp)	\
> -  PTR_MANGLE (dst, src, guard, tmp)
> -#  define PTR_DEMANGLE2(dst, src, guard)	\
> -  PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> -#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> -# endif
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE_LOAD(guard, tmp)					\
> -  LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
> -#  define PTR_MANGLE(dst, src, guard, tmp)				\
> -  PTR_MANGLE_LOAD(guard, tmp);						\
> -  PTR_MANGLE2(dst, src, guard)
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#  define PTR_MANGLE2(dst, src, guard)		\
> -  eor dst, src, guard
> -#  define PTR_DEMANGLE(dst, src, guard, tmp)	\
> -  PTR_MANGLE (dst, src, guard, tmp)
> -#  define PTR_DEMANGLE2(dst, src, guard)	\
> -  PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard attribute_relro;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> -#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> -# endif
> -#endif

Ok.

> diff --git a/sysdeps/csky/abiv2/__longjmp.S b/sysdeps/csky/abiv2/__longjmp.S
> index 762b2cb47f..bb7da548c2 100644
> --- a/sysdeps/csky/abiv2/__longjmp.S
> +++ b/sysdeps/csky/abiv2/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  ENTRY (__longjmp)
>  	mov	a2, a0
> diff --git a/sysdeps/csky/abiv2/setjmp.S b/sysdeps/csky/abiv2/setjmp.S
> index 0acf197d02..afef3ce390 100644
> --- a/sysdeps/csky/abiv2/setjmp.S
> +++ b/sysdeps/csky/abiv2/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  ENTRY (setjmp)
>  	movi	a1, 1
> diff --git a/sysdeps/csky/jmpbuf-unwind.h b/sysdeps/csky/jmpbuf-unwind.h
> index 358e912856..76fca431c6 100644
> --- a/sysdeps/csky/jmpbuf-unwind.h
> +++ b/sysdeps/csky/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/generic/pointer_guard.h b/sysdeps/generic/pointer_guard.h
> new file mode 100644
> index 0000000000..58a624e1d5
> --- /dev/null
> +++ b/sysdeps/generic/pointer_guard.h
> @@ -0,0 +1,29 @@
> +/* Pointer obfuscation implenentation.  Generic (no-op) version.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +/* Assembler code depends on PTR_MANGLE not being defined for
> +   optimization purposes.  */
> +#ifndef __ASSEMBLER__
> +# define PTR_MANGLE(x) (void) (x)
> +# define PTR_DEMANGLE(x) (void) (x)
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok, I think we can improve to use an empty declaration if we really need to
(since the ideia is to eventually always have a generic implementation to 
C code);

> diff --git a/sysdeps/generic/unwind-link.h b/sysdeps/generic/unwind-link.h
> index 93ee80f3f8..a2076a23bf 100644
> --- a/sysdeps/generic/unwind-link.h
> +++ b/sysdeps/generic/unwind-link.h
> @@ -31,7 +31,7 @@ unwind_arch_adjustment (void *prev, void *addr)
>  #endif
>  
>  #ifdef SHARED
> -# include <sysdep.h>
> +# include <pointer_guard.h>
>  # include <unwind-resume.h>
>  
>  # if UNWIND_LINK_FRAME_STATE_FOR
> diff --git a/sysdeps/i386/__longjmp.S b/sysdeps/i386/__longjmp.S
> index 508d370d5c..b67781ceb7 100644
> --- a/sysdeps/i386/__longjmp.S
> +++ b/sysdeps/i386/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/i386/bsd-_setjmp.S b/sysdeps/i386/bsd-_setjmp.S
> index 190e35b0c7..80399dba6e 100644
> --- a/sysdeps/i386/bsd-_setjmp.S
> +++ b/sysdeps/i386/bsd-_setjmp.S
> @@ -21,6 +21,7 @@
>     in setjmp doesn't clobber the state restored by longjmp.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <stap-probe.h>
> diff --git a/sysdeps/i386/bsd-setjmp.S b/sysdeps/i386/bsd-setjmp.S
> index 575ac96208..b367bad85f 100644
> --- a/sysdeps/i386/bsd-setjmp.S
> +++ b/sysdeps/i386/bsd-setjmp.S
> @@ -21,6 +21,7 @@
>     in setjmp doesn't clobber the state restored by longjmp.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <stap-probe.h>
> diff --git a/sysdeps/i386/jmpbuf-unwind.h b/sysdeps/i386/jmpbuf-unwind.h
> index 416c816b45..73d214fd31 100644
> --- a/sysdeps/i386/jmpbuf-unwind.h
> +++ b/sysdeps/i386/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/i386/setjmp.S b/sysdeps/i386/setjmp.S
> index 217efbdf8a..b528245806 100644
> --- a/sysdeps/i386/setjmp.S
> +++ b/sysdeps/i386/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
> index d6a99fcbc8..4c40ffa158 100644
> --- a/sysdeps/loongarch/__longjmp.S
> +++ b/sysdeps/loongarch/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <sys/asm.h>
>  
>  ENTRY (__longjmp)
> diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
> index 6fa509151d..458edec135 100644
> --- a/sysdeps/loongarch/jmpbuf-unwind.h
> +++ b/sysdeps/loongarch/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
> index 9b1cdea48c..e5f480d453 100644
> --- a/sysdeps/loongarch/setjmp.S
> +++ b/sysdeps/loongarch/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <sys/asm.h>
>  
>  ENTRY (_setjmp)
> diff --git a/sysdeps/m68k/jmpbuf-unwind.h b/sysdeps/m68k/jmpbuf-unwind.h
> index 17e4b859ab..3ee46c050c 100644
> --- a/sysdeps/m68k/jmpbuf-unwind.h
> +++ b/sysdeps/m68k/jmpbuf-unwind.h
> @@ -19,6 +19,7 @@
>  #include <setjmp.h>
>  #include <stdint.h>
>  #include <unwind.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/mach/hurd/i386/____longjmp_chk.S b/sysdeps/mach/hurd/i386/____longjmp_chk.S
> index 1a019e2e2b..81d297de0c 100644
> --- a/sysdeps/mach/hurd/i386/____longjmp_chk.S
> +++ b/sysdeps/mach/hurd/i386/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <tcb-offsets.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/mach/hurd/i386/__longjmp.S b/sysdeps/mach/hurd/i386/__longjmp.S
> index 72fcc79f4b..22915fb21e 100644
> --- a/sysdeps/mach/hurd/i386/__longjmp.S
> +++ b/sysdeps/mach/hurd/i386/__longjmp.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <tcb-offsets.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c
> index f8938bc6f4..2577fbf3ee 100644
> --- a/sysdeps/mach/hurd/jmp-unwind.c
> +++ b/sysdeps/mach/hurd/jmp-unwind.c
> @@ -22,7 +22,7 @@
>  #include <hurd/sigpreempt.h>
>  #include <assert.h>
>  #include <stdint.h>
> -
> +#include <pointer_guard.h>
>  
>  #ifndef _JMPBUF_UNWINDS
>  #error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS"
> diff --git a/sysdeps/microblaze/jmpbuf-unwind.h b/sysdeps/microblaze/jmpbuf-unwind.h
> index f23c7581a7..302e950ced 100644
> --- a/sysdeps/microblaze/jmpbuf-unwind.h
> +++ b/sysdeps/microblaze/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/mips/jmpbuf-unwind.h b/sysdeps/mips/jmpbuf-unwind.h
> index 813c24f3b1..28ecffedb0 100644
> --- a/sysdeps/mips/jmpbuf-unwind.h
> +++ b/sysdeps/mips/jmpbuf-unwind.h
> @@ -19,6 +19,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/nios2/__longjmp.S b/sysdeps/nios2/__longjmp.S
> index 214901d67d..13695e25a6 100644
> --- a/sysdeps/nios2/__longjmp.S
> +++ b/sysdeps/nios2/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  /* __longjmp(jmpbuf, val) */
> diff --git a/sysdeps/nios2/jmpbuf-offsets.h b/sysdeps/nios2/jmpbuf-offsets.h
> index a13aa76c16..76fea64ffe 100644
> --- a/sysdeps/nios2/jmpbuf-offsets.h
> +++ b/sysdeps/nios2/jmpbuf-offsets.h
> @@ -32,6 +32,7 @@
>  #include <setjmp.h>
>  #include <stdint.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  static inline uintptr_t __attribute__ ((unused))
>  _jmpbuf_sp (__jmp_buf jmpbuf)
> diff --git a/sysdeps/nios2/setjmp.S b/sysdeps/nios2/setjmp.S
> index 0aa5b23d4f..ec75108b87 100644
> --- a/sysdeps/nios2/setjmp.S
> +++ b/sysdeps/nios2/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  	.text
> diff --git a/sysdeps/powerpc/jmpbuf-unwind.h b/sysdeps/powerpc/jmpbuf-unwind.h
> index 706ceda5d4..93573ce238 100644
> --- a/sysdeps/powerpc/jmpbuf-unwind.h
> +++ b/sysdeps/powerpc/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/powerpc/powerpc32/__longjmp-common.S b/sysdeps/powerpc/powerpc32/__longjmp-common.S
> index 13ded200e2..0e0361e4fd 100644
> --- a/sysdeps/powerpc/powerpc32/__longjmp-common.S
> +++ b/sysdeps/powerpc/powerpc32/__longjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #ifdef __NO_VMX__
> diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
> index e3937222a7..de04a62be2 100644
> --- a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
> +++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #ifdef __NO_VMX__
> diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
> index f82196e6c2..1943ffd229 100644
> --- a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
> +++ b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #ifdef __NO_VMX__
> diff --git a/sysdeps/powerpc/powerpc32/setjmp-common.S b/sysdeps/powerpc/powerpc32/setjmp-common.S
> index c632a3f8f2..281dd65f6a 100644
> --- a/sysdeps/powerpc/powerpc32/setjmp-common.S
> +++ b/sysdeps/powerpc/powerpc32/setjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #ifdef __NO_VMX__
> diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S
> index 5f629e1e0f..ff3e0beb23 100644
> --- a/sysdeps/powerpc/powerpc64/__longjmp-common.S
> +++ b/sysdeps/powerpc/powerpc64/__longjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #define _SETJMP_H
> diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
> index 19e76d59ee..75389e4d26 100644
> --- a/sysdeps/powerpc/powerpc64/setjmp-common.S
> +++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <stap-probe.h>
>  #define _ASM
>  #ifdef __NO_VMX__
> diff --git a/sysdeps/riscv/jmpbuf-unwind.h b/sysdeps/riscv/jmpbuf-unwind.h
> index 28e73dda55..b411a246d1 100644
> --- a/sysdeps/riscv/jmpbuf-unwind.h
> +++ b/sysdeps/riscv/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/s390/jmpbuf-unwind.h b/sysdeps/s390/jmpbuf-unwind.h
> index b4ff8da6e2..10b37f09c3 100644
> --- a/sysdeps/s390/jmpbuf-unwind.h
> +++ b/sysdeps/s390/jmpbuf-unwind.h
> @@ -21,6 +21,7 @@
>  #include <unwind.h>
>  #include <bits/wordsize.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
> diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c
> index 09a3a2b8f8..83d42329a3 100644
> --- a/sysdeps/s390/s390-32/__longjmp.c
> +++ b/sysdeps/s390/s390-32/__longjmp.c
> @@ -17,6 +17,7 @@
>  
>  #include <errno.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <setjmp.h>
>  #include <bits/setjmp.h>
>  #include <stdlib.h>
> diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S
> index c15c7bb99a..08704238f8 100644
> --- a/sysdeps/s390/s390-32/setjmp.S
> +++ b/sysdeps/s390/s390-32/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #define _ASM
>  #define _SETJMP_H
>  #include <bits/setjmp.h>
> diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c
> index 2ca96e1b1b..9fe4939e5e 100644
> --- a/sysdeps/s390/s390-64/__longjmp.c
> +++ b/sysdeps/s390/s390-64/__longjmp.c
> @@ -17,6 +17,7 @@
>  
>  #include <errno.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <setjmp.h>
>  #include <bits/setjmp.h>
>  #include <stdlib.h>
> diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S
> index 6dcd77df15..5c59f571a2 100644
> --- a/sysdeps/s390/s390-64/setjmp.S
> +++ b/sysdeps/s390/s390-64/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #define _ASM
>  #define _SETJMP_H
>  #include <bits/setjmp.h>
> diff --git a/sysdeps/sh/jmpbuf-unwind.h b/sysdeps/sh/jmpbuf-unwind.h
> index c6672955ae..1957e5275d 100644
> --- a/sysdeps/sh/jmpbuf-unwind.h
> +++ b/sysdeps/sh/jmpbuf-unwind.h
> @@ -19,6 +19,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S
> index 4228b5fef7..f10bed2afe 100644
> --- a/sysdeps/sh/sh3/__longjmp.S
> +++ b/sysdeps/sh/sh3/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #define _SETJMP_H
>  #define _ASM
>  #include <bits/setjmp.h>
> diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S
> index 0dd0003efe..363e16fb15 100644
> --- a/sysdeps/sh/sh3/setjmp.S
> +++ b/sysdeps/sh/sh3/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  ENTRY (__sigsetjmp)
> diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S
> index 2013b71794..bc179e4584 100644
> --- a/sysdeps/sh/sh4/__longjmp.S
> +++ b/sysdeps/sh/sh4/__longjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #define _SETJMP_H
>  #define _ASM
>  #include <bits/setjmp.h>
> diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S
> index b73aa3c18c..f28ec42091 100644
> --- a/sysdeps/sh/sh4/setjmp.S
> +++ b/sysdeps/sh/sh4/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  ENTRY (__sigsetjmp)
> diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S
> index 5bed2440ac..68b3b15cb1 100644
> --- a/sysdeps/sparc/sparc32/__longjmp.S
> +++ b/sysdeps/sparc/sparc32/__longjmp.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #include <jmpbuf-offsets.h>
>  #define ENV(base,reg) [%base + (reg * 4)]
> diff --git a/sysdeps/sparc/sparc32/jmpbuf-unwind.h b/sysdeps/sparc/sparc32/jmpbuf-unwind.h
> index 3ab5088555..8b697ed95b 100644
> --- a/sysdeps/sparc/sparc32/jmpbuf-unwind.h
> +++ b/sysdeps/sparc/sparc32/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S
> index 9c7531bc95..c4e29c47b9 100644
> --- a/sysdeps/sparc/sparc32/setjmp.S
> +++ b/sysdeps/sparc/sparc32/setjmp.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <sys/trap.h>
>  
>  #include <jmpbuf-offsets.h>

Ok.

> diff --git a/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
> new file mode 100644
> index 0000000000..b81c9075f3
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
> @@ -0,0 +1,68 @@
> +/* Pointer guard implementation.  AArch64 version.
> +   Copyright (C) 2014-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +/* Pointer mangling is supported for AArch64.  */
> +#if (IS_IN (rtld) \
> +     || (!defined SHARED && (IS_IN (libc) \
> +                             || IS_IN (libpthread))))
> +# ifdef __ASSEMBLER__
> +/* Note, dst, src, guard, and tmp are all register numbers rather than
> +   register names so they will work with both ILP32 and LP64. */
> +#  define PTR_MANGLE(dst, src, guard, tmp)                                \
> +  LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
> +  PTR_MANGLE2 (dst, src, guard)
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#  define PTR_MANGLE2(dst, src, guard)\
> +  eor x##dst, x##src, x##guard
> +#  define PTR_DEMANGLE(dst, src, guard, tmp)\
> +  PTR_MANGLE (dst, src, guard, tmp)
> +#  define PTR_DEMANGLE2(dst, src, guard)\
> +  PTR_MANGLE2 (dst, src, guard)
> +# else
> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#else
> +# ifdef __ASSEMBLER__
> +/* Note, dst, src, guard, and tmp are all register numbers rather than
> +   register names so they will work with both ILP32 and LP64. */
> +#  define PTR_MANGLE(dst, src, guard, tmp)                             \
> +  LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));   \
> +  PTR_MANGLE2 (dst, src, guard)
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#  define PTR_MANGLE2(dst, src, guard)\
> +  eor x##dst, x##src, x##guard
> +#  define PTR_DEMANGLE(dst, src, guard, tmp)\
> +  PTR_MANGLE (dst, src, guard, tmp)
> +#  define PTR_DEMANGLE2(dst, src, guard)\
> +  PTR_MANGLE2 (dst, src, guard)
> +# else
> +#  include <stdint.h>
> +extern uintptr_t __pointer_chk_guard attribute_relro;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> +#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> index f1853e012f..8ba50dab8f 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> @@ -233,49 +233,4 @@
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -/* Pointer mangling is supported for AArch64.  */
> -#if (IS_IN (rtld) \
> -     || (!defined SHARED && (IS_IN (libc) \
> -			     || IS_IN (libpthread))))
> -# ifdef __ASSEMBLER__
> -/* Note, dst, src, guard, and tmp are all register numbers rather than
> -   register names so they will work with both ILP32 and LP64. */
> -#  define PTR_MANGLE(dst, src, guard, tmp)                                \
> -  LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
> -  PTR_MANGLE2 (dst, src, guard)
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#  define PTR_MANGLE2(dst, src, guard)\
> -  eor x##dst, x##src, x##guard
> -#  define PTR_DEMANGLE(dst, src, guard, tmp)\
> -  PTR_MANGLE (dst, src, guard, tmp)
> -#  define PTR_DEMANGLE2(dst, src, guard)\
> -  PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> -#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> -# endif
> -#else
> -# ifdef __ASSEMBLER__
> -/* Note, dst, src, guard, and tmp are all register numbers rather than
> -   register names so they will work with both ILP32 and LP64. */
> -#  define PTR_MANGLE(dst, src, guard, tmp)                             \
> -  LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));   \
> -  PTR_MANGLE2 (dst, src, guard)
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#  define PTR_MANGLE2(dst, src, guard)\
> -  eor x##dst, x##src, x##guard
> -#  define PTR_DEMANGLE(dst, src, guard, tmp)\
> -  PTR_MANGLE (dst, src, guard, tmp)
> -#  define PTR_DEMANGLE2(dst, src, guard)\
> -  PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard attribute_relro;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> -#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/aarch64/sysdep.h */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
> index 610f401d45..566a3b0211 100644
> --- a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
> +++ b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  
> diff --git a/sysdeps/unix/sysv/linux/alpha/pointer_guard.h b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h
> new file mode 100644
> index 0000000000..d4d513d816
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h
> @@ -0,0 +1,62 @@
> +/* Pointer guard implementation.  Alpha version.
> +   Copyright (C) 2006-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +/* Pointer mangling support.  Note that tls access is slow enough that
> +   we don't deoptimize things by placing the pointer check value there.  */
> +
> +#ifdef __ASSEMBLER__
> +# if IS_IN (rtld)
> +#  define PTR_MANGLE(dst, src, tmp)                             \
> +        ldah    tmp, __pointer_chk_guard_local($29) !gprelhigh; \
> +        ldq     tmp, __pointer_chk_guard_local(tmp) !gprellow;  \
> +        xor     src, tmp, dst
> +#  define PTR_MANGLE2(dst, src, tmp)                            \
> +        xor     src, tmp, dst
> +# elif defined SHARED
> +#  define PTR_MANGLE(dst, src, tmp)             \
> +        ldq     tmp, __pointer_chk_guard;       \
> +        xor     src, tmp, dst
> +# else
> +#  define PTR_MANGLE(dst, src, tmp)             \
> +        ldq     tmp, __pointer_chk_guard_local; \
> +        xor     src, tmp, dst
> +# endif
> +# define PTR_MANGLE2(dst, src, tmp)             \
> +        xor     src, tmp, dst
> +# define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
> +# define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
> +#else
> +# include <stdint.h>
> +# if (IS_IN (rtld) \
> +      || (!defined SHARED && (IS_IN (libc) \
> +                              || IS_IN (libpthread))))
> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> +#  define PTR_MANGLE(var) \
> +        (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> +# else
> +extern uintptr_t __pointer_chk_guard attribute_relro;
> +#  define PTR_MANGLE(var) \
> +        (var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> +# endif
> +# define PTR_DEMANGLE(var)  PTR_MANGLE(var)
> +#endif /* ASSEMBLER */
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
> index 77ec2b5400..0ddcb58b30 100644
> --- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
> @@ -313,44 +313,4 @@ __LABEL(name)						\
>  })
>  #endif /* ASSEMBLER */
>  
> -/* Pointer mangling support.  Note that tls access is slow enough that
> -   we don't deoptimize things by placing the pointer check value there.  */
> -
> -#ifdef __ASSEMBLER__
> -# if IS_IN (rtld)
> -#  define PTR_MANGLE(dst, src, tmp)				\
> -	ldah	tmp, __pointer_chk_guard_local($29) !gprelhigh;	\
> -	ldq	tmp, __pointer_chk_guard_local(tmp) !gprellow;	\
> -	xor	src, tmp, dst
> -#  define PTR_MANGLE2(dst, src, tmp)				\
> -	xor	src, tmp, dst
> -# elif defined SHARED
> -#  define PTR_MANGLE(dst, src, tmp)		\
> -	ldq	tmp, __pointer_chk_guard;	\
> -	xor	src, tmp, dst
> -# else
> -#  define PTR_MANGLE(dst, src, tmp)		\
> -	ldq	tmp, __pointer_chk_guard_local;	\
> -	xor	src, tmp, dst
> -# endif
> -# define PTR_MANGLE2(dst, src, tmp)		\
> -	xor	src, tmp, dst
> -# define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
> -# define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
> -#else
> -# include <stdint.h>
> -# if (IS_IN (rtld) \
> -      || (!defined SHARED && (IS_IN (libc) \
> -			      || IS_IN (libpthread))))
> -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> -#  define PTR_MANGLE(var) \
> -	(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> -# else
> -extern uintptr_t __pointer_chk_guard attribute_relro;
> -#  define PTR_MANGLE(var) \
> -	(var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> -# endif
> -# define PTR_DEMANGLE(var)  PTR_MANGLE(var)
> -#endif /* ASSEMBLER */
> -
>  #endif /* _LINUX_ALPHA_SYSDEP_H  */
> diff --git a/sysdeps/unix/sysv/linux/arc/sysdep.h b/sysdeps/unix/sysv/linux/arc/sysdep.h
> index d0c1a78381..512284a705 100644
> --- a/sysdeps/unix/sysv/linux/arc/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/arc/sysdep.h
> @@ -215,10 +215,6 @@ hidden_proto (__syscall_error)
>    LOAD_ARGS_6 (nm, arg1, arg2, arg3, arg4, arg5, arg6)	\
>    register long int _arg7 __asm__ ("r6") = _tmp7;
>  
> -/* Pointer mangling not yet supported.  */
> -# define PTR_MANGLE(var) (void) (var)
> -# define PTR_DEMANGLE(var) (void) (var)
> -
>  # undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
>  # define HAVE_INTERNAL_BRK_ADDR_SYMBOL  1
>  

Ok.

> diff --git a/sysdeps/unix/sysv/linux/csky/pointer_guard.h b/sysdeps/unix/sysv/linux/csky/pointer_guard.h
> new file mode 100644
> index 0000000000..ed683220c9
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/pointer_guard.h
> @@ -0,0 +1,68 @@
> +/* Pointer obfuscation implenentation.  C-SKY version.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if (IS_IN (rtld) \
> +     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(dst, src, guard)                   \
> +        grs     t0, 1f;                                 \
> +1:                                                      \
> +        lrw     guard, 1b@GOTPC;                        \
> +        addu    t0, guard;                              \
> +        lrw     guard, __pointer_chk_guard_local@GOT;   \
> +        ldr.w   guard, (t0, guard << 0);                \
> +        ldw     guard, (guard, 0);                      \
> +        xor     dst, src, guard;
> +#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> +#  define PTR_MANGLE2(dst, src, guard) \
> +        xor     dst, src, guard
> +#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
> +# else
> +extern uintptr_t __pointer_chk_guard_local;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> +#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> +# endif
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(dst, src, guard)           \
> +        grs     t0, 1f;                         \
> +1:                                              \
> +        lrw     guard, 1b@GOTPC;                \
> +        addu    t0, guard;                      \
> +        lrw     guard, __pointer_chk_guard@GOT; \
> +        ldr.w   guard, (t0, guard << 0);        \
> +        ldw     guard, (guard, 0);              \
> +        xor     dst, src, guard;
> +#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> +#  define PTR_MANGLE2(dst, src, guard) \
> +        xor     dst, src, guard
> +#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
> +# else
> +# include <stdint.h>
> +extern uintptr_t __pointer_chk_guard;
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> +#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.h b/sysdeps/unix/sysv/linux/csky/sysdep.h
> index 56c527fa8b..76b09f0cc6 100644
> --- a/sysdeps/unix/sysv/linux/csky/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/csky/sysdep.h
> @@ -466,50 +466,4 @@ __local_syscall_error:				\
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if (IS_IN (rtld) \
> -     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(dst, src, guard)			\
> -	grs	t0, 1f;					\
> -1:							\
> -	lrw	guard, 1b@GOTPC;			\
> -	addu	t0, guard;				\
> -	lrw	guard, __pointer_chk_guard_local@GOT;	\
> -	ldr.w	guard, (t0, guard << 0);		\
> -	ldw	guard, (guard, 0);			\
> -	xor	dst, src, guard;
> -#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> -#  define PTR_MANGLE2(dst, src, guard) \
> -	xor	dst, src, guard
> -#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard_local;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> -#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> -# endif
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(dst, src, guard)		\
> -	grs	t0, 1f;				\
> -1:						\
> -	lrw	guard, 1b@GOTPC;		\
> -	addu	t0, guard;			\
> -	lrw	guard, __pointer_chk_guard@GOT;	\
> -	ldr.w	guard, (t0, guard << 0);	\
> -	ldw	guard, (guard, 0);		\
> -	xor	dst, src, guard;
> -#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> -#  define PTR_MANGLE2(dst, src, guard) \
> -	xor	dst, src, guard
> -#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
> -# else
> -extern uintptr_t __pointer_chk_guard;
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> -#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/csky/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h
> index 2f339a4bd6..3aef8f536a 100644
> --- a/sysdeps/unix/sysv/linux/hppa/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h
> @@ -470,8 +470,4 @@ L(pre_end):					ASM_LINE_SEP	\
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -/* Pointer mangling is not yet supported for HPPA.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  #endif /* _LINUX_HPPA_SYSDEP_H */
> diff --git a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
> index a1cf9a4b21..f409542a62 100644
> --- a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
> +++ b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/unix/sysv/linux/i386/pointer_guard.h b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
> new file mode 100644
> index 0000000000..a2d2a0c38b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
> @@ -0,0 +1,49 @@
> +/* Pointer obfuscation implenentation.  i386 version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#include <tcb-offsets.h>
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  Using a global variable
> +   is too complicated here since we have no PC-relative addressing mode.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg)       xorl %gs:POINTER_GUARD, reg;                  \
> +                                roll $9, reg
> +#  define PTR_DEMANGLE(reg)     rorl $9, reg;                                 \
> +                                xorl %gs:POINTER_GUARD, reg
> +# else
> +#  define PTR_MANGLE(var)       asm ("xorl %%gs:%c2, %0\n"                    \
> +                                     "roll $9, %0"                            \
> +                                     : "=r" (var)                             \
> +                                     : "0" (var),                             \
> +                                       "i" (POINTER_GUARD))
> +#  define PTR_DEMANGLE(var)     asm ("rorl $9, %0\n"                          \
> +                                     "xorl %%gs:%c2, %0"                      \
> +                                     : "=r" (var)                             \
> +                                     : "0" (var),                             \
> +                                       "i" (POINTER_GUARD))
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */


Ok.
> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
> index 7085f7e19a..b8be668a42 100644
> --- a/sysdeps/unix/sysv/linux/i386/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
> @@ -446,34 +446,6 @@ struct libc_do_syscall_args
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  Using a global variable
> -   is too complicated here since we have no PC-relative addressing mode.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)	xorl %gs:POINTER_GUARD, reg;		      \
> -				roll $9, reg
> -#  define PTR_DEMANGLE(reg)	rorl $9, reg;				      \
> -				xorl %gs:POINTER_GUARD, reg
> -# else
> -#  define PTR_MANGLE(var)	asm ("xorl %%gs:%c2, %0\n"		      \
> -				     "roll $9, %0"			      \
> -				     : "=r" (var)			      \
> -				     : "0" (var),			      \
> -				       "i" (offsetof (tcbhead_t,	      \
> -						      pointer_guard)))
> -#  define PTR_DEMANGLE(var)	asm ("rorl $9, %0\n"			      \
> -				     "xorl %%gs:%c2, %0"		      \
> -				     : "=r" (var)			      \
> -				     : "0" (var),			      \
> -				       "i" (offsetof (tcbhead_t,	      \
> -						      pointer_guard)))
> -# endif
> -#endif
> -
>  /* Each shadow stack slot takes 4 bytes.  Assuming that each stack
>     frame takes 128 bytes, this is used to compute shadow stack size
>     from stack size.  */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
> index 9511c15945..4ef5129623 100644
> --- a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
> +++ b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
> @@ -15,6 +15,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <features.h>
>  
>  LEAF(__ia64_flush_rbs)
> diff --git a/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
> index 793dc98cc1..da9653d8a7 100644
> --- a/sysdeps/unix/sysv/linux/ia64/__longjmp.S
> +++ b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
> @@ -31,6 +31,7 @@
>  		bits into ar.rnat after setting ar.bspstore. */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <features.h>
>  
>  #	define	pPos	p6	/* is rotate count positive? */
> diff --git a/sysdeps/unix/sysv/linux/ia64/pointer_guard.h b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h
> new file mode 100644
> index 0000000000..8631f39374
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h
> @@ -0,0 +1,44 @@
> +/* Pointer obfuscation implenentation.  ia64 version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg, tmpreg) \
> +        add     tmpreg=-16,r13          \
> +        ;;                              \
> +        ld8     tmpreg=[tmpreg]         \
> +        ;;                              \
> +        xor     reg=reg, tmpreg
> +#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/ia64/setjmp.S b/sysdeps/unix/sysv/linux/ia64/setjmp.S
> index c29a31f7a6..a978dd4360 100644
> --- a/sysdeps/unix/sysv/linux/ia64/setjmp.S
> +++ b/sysdeps/unix/sysv/linux/ia64/setjmp.S
> @@ -63,6 +63,7 @@
>  	0x1c0	f31 */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <features.h>
>  
>  	/* The following two entry points are the traditional entry points: */
> diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h
> index 14adbdf4ff..b450c6c224 100644
> --- a/sysdeps/unix/sysv/linux/ia64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h
> @@ -324,24 +324,4 @@
>  
>  #endif /* not __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg, tmpreg) \
> -        add	tmpreg=-16,r13		\
> -        ;;				\
> -        ld8	tmpreg=[tmpreg]		\
> -        ;;				\
> -        xor	reg=reg, tmpreg
> -#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/ia64/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
> new file mode 100644
> index 0000000000..4b2ed46167
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
> @@ -0,0 +1,82 @@
> +/* Pointer obfuscation implenentation.  LoongArch version.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +/* Load a got-relative EXPR into G, using T.
> +   Note G and T are register names.  */
> +#define LD_GLOBAL(G, EXPR) \
> +  la.global G,  EXPR; \
> +  REG_L     G,  G,  0;
> +
> +/* Load a pc-relative EXPR into G, using T.
> +   Note G and T are register names.  */
> +#define LD_PCREL(G, EXPR) \
> +  la.pcrel  G,  EXPR; \
> +  REG_L     G,  G,  0;
> +
> +#if (IS_IN (rtld) \
> +     || (!defined SHARED && (IS_IN (libc) \
> +     || IS_IN (libpthread))))
> +
> +#ifdef __ASSEMBLER__
> +#define PTR_MANGLE(dst, src, guard) \
> +  LD_PCREL (guard, __pointer_chk_guard_local); \
> +  PTR_MANGLE2 (dst, src, guard);
> +#define PTR_DEMANGLE(dst, src, guard) \
> +  LD_PCREL (guard, __pointer_chk_guard_local); \
> +  PTR_DEMANGLE2 (dst, src, guard);
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#define PTR_MANGLE2(dst, src, guard) \
> +  xor  dst, src, guard;
> +#define PTR_DEMANGLE2(dst, src, guard) \
> +  PTR_MANGLE2 (dst, src, guard);
> +#else
> +# include <stdint.h>
> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> +#define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> +#define PTR_DEMANGLE(var) PTR_MANGLE (var)
> +#endif
> +
> +#else
> +
> +#ifdef __ASSEMBLER__
> +#define PTR_MANGLE(dst, src, guard) \
> +  LD_GLOBAL (guard, __pointer_chk_guard); \
> +  PTR_MANGLE2 (dst, src, guard);
> +#define PTR_DEMANGLE(dst, src, guard) \
> +  LD_GLOBAL (guard, __pointer_chk_guard); \
> +  PTR_DEMANGLE2 (dst, src, guard);
> +/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> +#define PTR_MANGLE2(dst, src, guard) \
> +  xor dst, src, guard;
> +#define PTR_DEMANGLE2(dst, src, guard) \
> +  PTR_MANGLE2 (dst, src, guard);
> +#else
> +# include <stdint.h>
> +extern uintptr_t __pointer_chk_guard attribute_relro;
> +#define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> +#define PTR_DEMANGLE(var) PTR_MANGLE (var)
> +#endif
> +
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> index f4a1d23a97..09f8243f25 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> @@ -314,64 +314,4 @@ extern long int __syscall_error (long int neg_errno);
>  
>  #endif /* ! __ASSEMBLER__ */
>  
> -/* Pointer mangling is supported for LoongArch.  */
> -
> -/* Load a got-relative EXPR into G, using T.
> -   Note G and T are register names.  */
> -#define LD_GLOBAL(G, EXPR) \
> -  la.global G,	EXPR; \
> -  REG_L	    G,	G,  0;
> -
> -/* Load a pc-relative EXPR into G, using T.
> -   Note G and T are register names.  */
> -#define LD_PCREL(G, EXPR) \
> -  la.pcrel  G,	EXPR; \
> -  REG_L	    G,	G,  0;
> -
> -#if (IS_IN (rtld) \
> -     || (!defined SHARED && (IS_IN (libc) \
> -     || IS_IN (libpthread))))
> -
> -#ifdef __ASSEMBLER__
> -#define PTR_MANGLE(dst, src, guard) \
> -  LD_PCREL (guard, __pointer_chk_guard_local); \
> -  PTR_MANGLE2 (dst, src, guard);
> -#define PTR_DEMANGLE(dst, src, guard) \
> -  LD_PCREL (guard, __pointer_chk_guard_local); \
> -  PTR_DEMANGLE2 (dst, src, guard);
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#define PTR_MANGLE2(dst, src, guard) \
> -  xor  dst, src, guard;
> -#define PTR_DEMANGLE2(dst, src, guard) \
> -  PTR_MANGLE2 (dst, src, guard);
> -#else
> -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> -#define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
> -#define PTR_DEMANGLE(var) PTR_MANGLE (var)
> -#endif
> -
> -#else
> -
> -#ifdef __ASSEMBLER__
> -#define PTR_MANGLE(dst, src, guard) \
> -  LD_GLOBAL (guard, __pointer_chk_guard); \
> -  PTR_MANGLE2 (dst, src, guard);
> -#define PTR_DEMANGLE(dst, src, guard) \
> -  LD_GLOBAL (guard, __pointer_chk_guard); \
> -  PTR_DEMANGLE2 (dst, src, guard);
> -/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
> -#define PTR_MANGLE2(dst, src, guard) \
> -  xor dst, src, guard;
> -#define PTR_DEMANGLE2(dst, src, guard) \
> -  PTR_MANGLE2 (dst, src, guard);
> -#else
> -extern uintptr_t __pointer_chk_guard attribute_relro;
> -#define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
> -#define PTR_DEMANGLE(var) PTR_MANGLE (var)
> -#endif
> -
> -#endif
> -
>  #endif /* linux/loongarch/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h
> index d87892a377..064240330a 100644
> --- a/sysdeps/unix/sysv/linux/m68k/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h
> @@ -295,10 +295,6 @@ SYSCALL_ERROR_LABEL:							      \
>  
>  #endif /* not __ASSEMBLER__ */
>  
> -/* Pointer mangling is not yet supported for M68K.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  /* M68K needs system-supplied DSO to access TLS helpers
>     even when statically linked.  */
>  #define NEED_STATIC_SYSINFO_DSO 1
> diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep.h b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> index fda78f6467..19805f6b5d 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> @@ -304,10 +304,6 @@ SYSCALL_ERROR_LABEL_DCL:                            \
>    })
>  
>  
> -/* Pointer mangling is not yet supported for Microblaze.  */
> -# define PTR_MANGLE(var) (void) (var)
> -# define PTR_DEMANGLE(var) (void) (var)
> -
>  #undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
>  #define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1
>  
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
> index a2a93bc840..0ef410c3c9 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
> @@ -337,8 +337,4 @@ libc_hidden_proto (__mips_syscall7, nomips16)
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling is not yet supported for MIPS.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  #endif /* linux/mips/mips32/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
> index 2c16a6758d..e362f15300 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
> @@ -300,8 +300,4 @@ typedef long int __syscall_arg_t;
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling is not yet supported for MIPS.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  #endif /* linux/mips/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/nios2/pointer_guard.h b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h
> new file mode 100644
> index 0000000000..da17809592
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h
> @@ -0,0 +1,40 @@
> +/* Pointer obfuscation implenentation.  Nios II version.
> +   Copyright (C) 2015-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
> +#  define PTR_MANGLE(dst, src, guard) xor dst, src, guard
> +#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep.h b/sysdeps/unix/sysv/linux/nios2/sysdep.h
> index 5fe960c2a5..46667b9c19 100644
> --- a/sysdeps/unix/sysv/linux/nios2/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/nios2/sysdep.h
> @@ -220,21 +220,4 @@
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
> -#  define PTR_MANGLE(dst, src, guard) xor dst, src, guard
> -#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
> -
>  #endif /* linux/nios2/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/or1k/sysdep.h b/sysdeps/unix/sysv/linux/or1k/sysdep.h
> index 941c934554..b1fdf2a806 100644
> --- a/sysdeps/unix/sysv/linux/or1k/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/or1k/sysdep.h
> @@ -119,10 +119,6 @@ L(pseudo_end): \
>  
>  extern long int __syscall_error (long int neg_errno);
>  
> -/* Pointer mangling is not yet supported for or1k.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  #undef INTERNAL_SYSCALL
>  #define INTERNAL_SYSCALL(name, nr, args...) \
>  	INTERNAL_SYSCALL_NCS (SYS_ify (name), nr, args)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
> new file mode 100644
> index 0000000000..5961793c0d
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
> @@ -0,0 +1,55 @@
> +/* Pointer obfuscation implenentation.  PowerpC version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  if defined(__PPC64__) || defined(__powerpc64__)
> +#   define LOAD  ld
> +#   define TPREG r13
> +#  else
> +#   define LOAD  lwz
> +#   define TPREG r2
> +#  endif
> +#  define PTR_MANGLE(reg, tmpreg) \
> +        LOAD    tmpreg,POINTER_GUARD(TPREG); \
> +        xor     reg,tmpreg,reg
> +#  define PTR_MANGLE2(reg, tmpreg) \
> +        xor     reg,tmpreg,reg
> +#  define PTR_MANGLE3(destreg, reg, tmpreg) \
> +        LOAD    tmpreg,POINTER_GUARD(TPREG); \
> +        xor     destreg,tmpreg,reg
> +#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> +#  define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
> +#  define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
> index 4fb135aa8d..9e44818978 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
> @@ -207,38 +207,6 @@
>  #define ASM_INPUT_5 ASM_INPUT_4, "5" (r7)
>  #define ASM_INPUT_6 ASM_INPUT_5, "6" (r8)
>  
> -
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  if defined(__PPC64__) || defined(__powerpc64__)
> -#   define LOAD  ld
> -#   define TPREG r13
> -#  else
> -#   define LOAD  lwz
> -#   define TPREG r2
> -#  endif
> -#  define PTR_MANGLE(reg, tmpreg) \
> -	LOAD	tmpreg,POINTER_GUARD(TPREG); \
> -	xor	reg,tmpreg,reg
> -#  define PTR_MANGLE2(reg, tmpreg) \
> -	xor	reg,tmpreg,reg
> -#  define PTR_MANGLE3(destreg, reg, tmpreg) \
> -	LOAD	tmpreg,POINTER_GUARD(TPREG); \
> -	xor	destreg,tmpreg,reg
> -#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> -#  define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
> -#  define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  /* List of system calls which are supported as vsyscalls.  */
>  #define VDSO_NAME  "LINUX_2.6.15"
>  #define VDSO_HASH  123718565
> diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h
> index 9b03b10567..c9af888132 100644
> --- a/sysdeps/unix/sysv/linux/riscv/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h
> @@ -357,8 +357,4 @@ extern long int __syscall_error (long int neg_errno);
>  
>  #endif /* ! __ASSEMBLER__ */
>  
> -/* Pointer mangling is not supported.  */
> -#define PTR_MANGLE(var) (void) (var)
> -#define PTR_DEMANGLE(var) (void) (var)
> -
>  #endif /* linux/riscv/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
> new file mode 100644
> index 0000000000..0e85d4ccbb
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
> @@ -0,0 +1,45 @@
> +/* Pointer obfuscation implenentation.  s390 version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +/* For the time being just use stack_guard rather than a separate
> +   pointer_guard.  */
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg, tmpreg) \
> +  ear     tmpreg,%a0;                   \
> +  x       reg,STACK_GUARD(tmpreg)
> +#  define PTR_MANGLE2(reg, tmpreg) \
> +  x       reg,STACK_GUARD(tmpreg)
> +#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
> index e41106b377..a24fde7c6d 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
> @@ -177,25 +177,4 @@
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -/* For the time being just use stack_guard rather than a separate
> -   pointer_guard.  */
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg, tmpreg) \
> -  ear     tmpreg,%a0;			\
> -  x       reg,STACK_GUARD(tmpreg)
> -#  define PTR_MANGLE2(reg, tmpreg) \
> -  x       reg,STACK_GUARD(tmpreg)
> -#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* _LINUX_S390_SYSDEP_H */
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
> new file mode 100644
> index 0000000000..5285456806
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
> @@ -0,0 +1,47 @@
> +/* Pointer obfuscation implenentation.  s390x version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +/* For the time being just use stack_guard rather than a separate
> +   pointer_guard.  */
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg, tmpreg) \
> +  ear     tmpreg,%a0;			\
> +  sllg    tmpreg,tmpreg,32;		\
> +  ear     tmpreg,%a1;			\
> +  xg      reg,STACK_GUARD(tmpreg)
> +#  define PTR_MANGLE2(reg, tmpreg) \
> +  xg      reg,STACK_GUARD(tmpreg)
> +#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> index 150e33981a..79bc0fa4a6 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> @@ -175,27 +175,4 @@
>  
>  #endif /* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -/* For the time being just use stack_guard rather than a separate
> -   pointer_guard.  */
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg, tmpreg) \
> -  ear     tmpreg,%a0;			\
> -  sllg    tmpreg,tmpreg,32;		\
> -  ear     tmpreg,%a1;			\
> -  xg      reg,STACK_GUARD(tmpreg)
> -#  define PTR_MANGLE2(reg, tmpreg) \
> -  xg      reg,STACK_GUARD(tmpreg)
> -#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* _LINUX_S390_SYSDEP_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
> index e821e158c4..cf69926316 100644
> --- a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
> +++ b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #include <sigaltstack-offsets.h>
>  

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sh/pointer_guard.h b/sysdeps/unix/sysv/linux/sh/pointer_guard.h
> new file mode 100644
> index 0000000000..32a571d496
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sh/pointer_guard.h
> @@ -0,0 +1,43 @@
> +/* Pointer obfuscation implenentation.  Generic (no-op) version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  Using a global variable
> +   is too complicated here since we have no PC-relative addressing mode.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg, tmp) \
> +     stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
> +#  define PTR_MANGLE2(reg, tmp) xor tmp,reg
> +#  define PTR_DEMANGLE(reg, tmp)        PTR_MANGLE (reg, tmp)
> +#  define PTR_DEMANGLE2(reg, tmp)       PTR_MANGLE2 (reg, tmp)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +     (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
> index e9e13cd184..a2f43f68c3 100644
> --- a/sysdeps/unix/sysv/linux/sh/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/sh/sysdep.h
> @@ -315,23 +315,4 @@
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  Using a global variable
> -   is too complicated here since we have no PC-relative addressing mode.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg, tmp) \
> -     stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
> -#  define PTR_MANGLE2(reg, tmp)	xor tmp,reg
> -#  define PTR_DEMANGLE(reg, tmp)	PTR_MANGLE (reg, tmp)
> -#  define PTR_DEMANGLE2(reg, tmp)	PTR_MANGLE2 (reg, tmp)
> -# else
> -#  define PTR_MANGLE(var) \
> -     (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/sh/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
> index 8e8cb4d751..ad23840bcd 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  
>  #define ENV(base,reg) [%base + (reg * 4)]

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
> new file mode 100644
> index 0000000000..4063513cd8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
> @@ -0,0 +1,44 @@
> +/* Pointer obfuscation implenentation.  32-bit SPARC version.
> +   Copyright (C) 2006-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(dreg, reg, tmpreg) \
> +  ld    [%g7 + POINTER_GUARD], tmpreg; \
> +  xor   reg, tmpreg, dreg
> +#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
> +#  define PTR_MANGLE2(dreg, reg, tmpreg) \
> +  xor   reg, tmpreg, dreg
> +#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
> index 032608a4e0..1783af8178 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
> @@ -125,24 +125,4 @@ ENTRY(name);					\
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(dreg, reg, tmpreg) \
> -  ld	[%g7 + POINTER_GUARD], tmpreg; \
> -  xor	reg, tmpreg, dreg
> -#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
> -#  define PTR_MANGLE2(dreg, reg, tmpreg) \
> -  xor	reg, tmpreg, dreg
> -#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/sparc/sysdep.h */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
> new file mode 100644
> index 0000000000..7865e87c73
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
> @@ -0,0 +1,44 @@
> +/* Pointer obfuscation implenentation.  64-bit SPARC version.
> +   Copyright (C) 2006-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# include <sysdeps/generic/pointer_guard.h>
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(dreg, reg, tmpreg) \
> +  ldx   [%g7 + POINTER_GUARD], tmpreg; \
> +  xor   reg, tmpreg, dreg
> +#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
> +#  define PTR_MANGLE2(dreg, reg, tmpreg) \
> +  xor   reg, tmpreg, dreg
> +#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
> +# else
> +#  include <stdint.h>
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) \
> +  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> +#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
> index 4aaa2912ce..4ae22ae25b 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
> @@ -127,24 +127,4 @@ ENTRY(name);					\
>     register windows.  So if you poke stack memory directly you add this.  */
>  #define STACK_BIAS	2047
>  
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(dreg, reg, tmpreg) \
> -  ldx	[%g7 + POINTER_GUARD], tmpreg; \
> -  xor	reg, tmpreg, dreg
> -#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
> -#  define PTR_MANGLE2(dreg, reg, tmpreg) \
> -  xor	reg, tmpreg, dreg
> -#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
> -# else
> -#  define PTR_MANGLE(var) \
> -  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
> -#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
> -# endif
> -#endif
> -
>  #endif /* linux/sparc64/sysdep.h */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
> index ffdf4624bf..5ff275c436 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
> +++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <asm-syntax.h>
>  #include <stap-probe.h>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> new file mode 100644
> index 0000000000..2df3912897
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> @@ -0,0 +1,61 @@
> +/* Pointer obfuscation implenentation.  x86-64 version.
> +   Copyright (C) 2005-2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef POINTER_GUARD_H
> +#define POINTER_GUARD_H
> +
> +#include <x86-lp_size.h>
> +#include <tcb-offsets.h>
> +
> +#if IS_IN (rtld)
> +/* We cannot use the thread descriptor because in ld.so we use setjmp
> +   earlier than the descriptor is initialized.  */
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg)       xor __pointer_chk_guard_local(%rip), reg;    \
> +                                rol $2*LP_SIZE+1, reg
> +#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                       \
> +                                xor __pointer_chk_guard_local(%rip), reg
> +# else
> +#  define PTR_MANGLE(reg)       asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \
> +                                     "rol $2*" LP_SIZE "+1, %0"                   \
> +                                     : "=r" (reg) : "0" (reg))
> +#  define PTR_DEMANGLE(reg)     asm ("ror $2*" LP_SIZE "+1, %0\n"                 \
> +                                     "xor __pointer_chk_guard_local(%%rip), %0"   \
> +                                     : "=r" (reg) : "0" (reg))
> +# endif
> +#else
> +# ifdef __ASSEMBLER__
> +#  define PTR_MANGLE(reg)       xor %fs:POINTER_GUARD, reg;                   \
> +                                rol $2*LP_SIZE+1, reg
> +#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                        \
> +                                xor %fs:POINTER_GUARD, reg
> +# else
> +#  define PTR_MANGLE(var)       asm ("xor %%fs:%c2, %0\n"                     \
> +                                     "rol $2*" LP_SIZE "+1, %0"               \
> +                                     : "=r" (var)                             \
> +                                     : "0" (var),                             \
> +                                       "i" (POINTER_GUARD))
> +#  define PTR_DEMANGLE(var)     asm ("ror $2*" LP_SIZE "+1, %0\n"             \
> +                                     "xor %%fs:%c2, %0"                       \
> +                                     : "=r" (var)                             \
> +                                     : "0" (var),                             \
> +                                       "i" (POINTER_GUARD))
> +# endif
> +#endif
> +
> +#endif /* POINTER_GUARD_H */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> index 740abefcfd..5e4d7827d7 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> @@ -381,46 +381,6 @@
>  
>  #endif	/* __ASSEMBLER__ */
>  
> -
> -/* Pointer mangling support.  */
> -#if IS_IN (rtld)
> -/* We cannot use the thread descriptor because in ld.so we use setjmp
> -   earlier than the descriptor is initialized.  */
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)	xor __pointer_chk_guard_local(%rip), reg;    \
> -				rol $2*LP_SIZE+1, reg
> -#  define PTR_DEMANGLE(reg)	ror $2*LP_SIZE+1, reg;			     \
> -				xor __pointer_chk_guard_local(%rip), reg
> -# else
> -#  define PTR_MANGLE(reg)	asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \
> -				     "rol $2*" LP_SIZE "+1, %0"			  \
> -				     : "=r" (reg) : "0" (reg))
> -#  define PTR_DEMANGLE(reg)	asm ("ror $2*" LP_SIZE "+1, %0\n"		  \
> -				     "xor __pointer_chk_guard_local(%%rip), %0"   \
> -				     : "=r" (reg) : "0" (reg))
> -# endif
> -#else
> -# ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)	xor %fs:POINTER_GUARD, reg;		      \
> -				rol $2*LP_SIZE+1, reg
> -#  define PTR_DEMANGLE(reg)	ror $2*LP_SIZE+1, reg;			      \
> -				xor %fs:POINTER_GUARD, reg
> -# else
> -#  define PTR_MANGLE(var)	asm ("xor %%fs:%c2, %0\n"		      \
> -				     "rol $2*" LP_SIZE "+1, %0"		      \
> -				     : "=r" (var)			      \
> -				     : "0" (var),			      \
> -				       "i" (offsetof (tcbhead_t,	      \
> -						      pointer_guard)))
> -#  define PTR_DEMANGLE(var)	asm ("ror $2*" LP_SIZE "+1, %0\n"	      \
> -				     "xor %%fs:%c2, %0"			      \
> -				     : "=r" (var)			      \
> -				     : "0" (var),			      \
> -				       "i" (offsetof (tcbhead_t,	      \
> -						      pointer_guard)))
> -# endif
> -#endif
> -
>  /* How to pass the off{64}_t argument on p{readv,writev}{64}.  */
>  #undef LO_HI_LONG
>  #define LO_HI_LONG(val) (val), 0

Ok.

> diff --git a/sysdeps/x86_64/__longjmp.S b/sysdeps/x86_64/__longjmp.S
> index b51d79168c..6fdb4ccfbf 100644
> --- a/sysdeps/x86_64/__longjmp.S
> +++ b/sysdeps/x86_64/__longjmp.S
> @@ -16,6 +16,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/x86_64/jmpbuf-unwind.h b/sysdeps/x86_64/jmpbuf-unwind.h
> index 42ea37508e..c92b2633bc 100644
> --- a/sysdeps/x86_64/jmpbuf-unwind.h
> +++ b/sysdeps/x86_64/jmpbuf-unwind.h
> @@ -20,6 +20,7 @@
>  #include <stdint.h>
>  #include <unwind.h>
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  /* Test if longjmp to JMPBUF would unwind the frame
>     containing a local variable at ADDRESS.  */
> diff --git a/sysdeps/x86_64/setjmp.S b/sysdeps/x86_64/setjmp.S
> index 1b77dcd4f9..3897e66dc4 100644
> --- a/sysdeps/x86_64/setjmp.S
> +++ b/sysdeps/x86_64/setjmp.S
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdep.h>
> +#include <pointer_guard.h>
>  #include <jmpbuf-offsets.h>
>  #include <jmp_buf-ssp.h>
>  #include <asm-syntax.h>
> diff --git a/sysdeps/x86_64/x32/x86-lp_size.h b/sysdeps/x86_64/x32/x86-lp_size.h
> index ad03eb66b2..0b71e58be5 100644
> --- a/sysdeps/x86_64/x32/x86-lp_size.h
> +++ b/sysdeps/x86_64/x32/x86-lp_size.h
> @@ -1,4 +1,4 @@
> -/* Pointer size definition for x86-64 x42.
> +/* Pointer size definition for x86-64 x32.
>     Copyright (C) 2022 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>  
> diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c
> index 21e52a67f4..7023ec99f1 100644
> --- a/wcsmbs/btowc.c
> +++ b/wcsmbs/btowc.c
> @@ -24,7 +24,7 @@
>  #include <wcsmbsload.h>
>  #include <limits.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  wint_t
> diff --git a/wcsmbs/mbrtoc16.c b/wcsmbs/mbrtoc16.c
> index b23d9b0160..f8b029b58a 100644
> --- a/wcsmbs/mbrtoc16.c
> +++ b/wcsmbs/mbrtoc16.c
> @@ -22,7 +22,7 @@
>  #include <uchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/mbrtoc8.c b/wcsmbs/mbrtoc8.c
> index dd80b5282d..e745a49e09 100644
> --- a/wcsmbs/mbrtoc8.c
> +++ b/wcsmbs/mbrtoc8.c
> @@ -23,8 +23,6 @@
>  #include <uchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> -
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
>  #endif
> diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c
> index 78d9994f67..46a1cc38df 100644
> --- a/wcsmbs/mbrtowc.c
> +++ b/wcsmbs/mbrtowc.c
> @@ -22,7 +22,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/mbsnrtowcs.c b/wcsmbs/mbsnrtowcs.c
> index 5860822400..06a1f2d36f 100644
> --- a/wcsmbs/mbsnrtowcs.c
> +++ b/wcsmbs/mbsnrtowcs.c
> @@ -23,7 +23,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/mbsrtowcs_l.c b/wcsmbs/mbsrtowcs_l.c
> index 0ebc389fdb..526b88e1dd 100644
> --- a/wcsmbs/mbsrtowcs_l.c
> +++ b/wcsmbs/mbsrtowcs_l.c
> @@ -27,7 +27,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c
> index c0cce3792f..42690f2efd 100644
> --- a/wcsmbs/wcrtomb.c
> +++ b/wcsmbs/wcrtomb.c
> @@ -25,7 +25,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c
> index 9707f6f4bc..6ba180cdc2 100644
> --- a/wcsmbs/wcsnrtombs.c
> +++ b/wcsmbs/wcsnrtombs.c
> @@ -22,7 +22,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c
> index b1ac704b28..7db2b181b3 100644
> --- a/wcsmbs/wcsrtombs.c
> +++ b/wcsmbs/wcsrtombs.c
> @@ -23,7 +23,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  #ifndef EILSEQ
>  # define EILSEQ EINVAL
> diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c
> index 573c2c9448..5dfbd7ab7e 100644
> --- a/wcsmbs/wctob.c
> +++ b/wcsmbs/wctob.c
> @@ -22,7 +22,7 @@
>  #include <wchar.h>
>  #include <wcsmbsload.h>
>  
> -#include <sysdep.h>
> +#include <pointer_guard.h>
>  
>  
>  int

Ok.
  
Florian Weimer Oct. 18, 2022, 3:03 p.m. UTC | #2
* Adhemerval Zanella Netto:

> On 13/10/22 09:20, Florian Weimer via Libc-alpha wrote:
>> This allows us to define a generic no-op version of PTR_MANGLE and
>> PTR_DEMANGLE.  In the future, we can use PTR_MANGLE and PTR_DEMANGLE
>> unconditionally in C sources, avoiding an unintended loss of hardening
>> due to missing include files or unlucky header inclusion ordering.
>
> Could we also improve the generic implementation to always XOR with the
> pointer guard and move it to be a proper static inline function?  I think
> we can then remove a lot of boilerplate code each architecture need to
> have.

I think the assembler implementation in part aims to avoid leaving the
plain guard value behind in a register, at least on some targets.

>> In i386 and x86_64, we can avoid a <tls.h> dependency in the C
>> code by using the computed constant from <tcb-offsets.h>.  <sysdep.h>
>> no longer includes these definitions, so there is no cyclic dependency
>> anymore when computing the <tcb-offsets.h> constants.
>
> LGTM, thanks.
>
> Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

Thanks,
Florian
  

Patch

diff --git a/hurd/sigunwind.c b/hurd/sigunwind.c
index de76cf2436..28213091e3 100644
--- a/hurd/sigunwind.c
+++ b/hurd/sigunwind.c
@@ -22,7 +22,7 @@ 
 #include <jmpbuf-unwind.h>
 #include <assert.h>
 #include <stdint.h>
-
+#include <pointer_guard.h>
 
 /* _hurd_setup_sighandler puts a link on the `active resources' chain so that
    _longjmp_unwind will call this function with the `struct sigcontext *'
diff --git a/iconv/gconv.c b/iconv/gconv.c
index 62d2b37bcd..dea9c80fee 100644
--- a/iconv/gconv.c
+++ b/iconv/gconv.c
@@ -23,7 +23,7 @@ 
 #include <sys/param.h>
 
 #include <gconv_int.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 int
diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index c772856d1f..5dbf596b8d 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -28,6 +28,7 @@ 
 #include <gconv_int.h>
 #include <iconvconfig.h>
 #include <not-cancel.h>
+#include <pointer_guard.h>
 
 #include "../intl/hash-string.h"
 
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index bf385ac7b1..90037fdf58 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -27,7 +27,7 @@ 
 
 #include <dlfcn.h>
 #include <gconv_int.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 /* Simple data structure for alias mapping.  We have two names, `from'
diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
index 24c0bd1d39..c93c5dd380 100644
--- a/iconv/gconv_dl.c
+++ b/iconv/gconv_dl.c
@@ -26,7 +26,7 @@ 
 #include <sys/param.h>
 
 #include <gconv_int.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 #ifdef DEBUG
diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c
index 1ebbbfd51b..0f4ce10996 100644
--- a/iconv/gconv_trans.c
+++ b/iconv/gconv_trans.c
@@ -26,6 +26,7 @@ 
 #include <libc-lock.h>
 #include "gconv_int.h"
 #include "../locale/localeinfo.h"
+#include <pointer_guard.h>
 
 
 int
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index 0356dbf92b..42ee0b6508 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -147,7 +147,7 @@ 
 # include <dlfcn.h>
 #endif
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 #include <stdint.h>
 
 #ifndef DL_CALL_FCT
diff --git a/inet/idna.c b/inet/idna.c
index 9c76681c6a..df5811fd6a 100644
--- a/inet/idna.c
+++ b/inet/idna.c
@@ -21,6 +21,7 @@ 
 #include <inet/net-internal.h>
 #include <netdb.h>
 #include <stdbool.h>
+#include <pointer_guard.h>
 
 /* Use the soname and version to locate libidn2, to ensure a
    compatible ABI.  */
diff --git a/libio/iofopncook.c b/libio/iofopncook.c
index e108ad2199..a7db4ef1c9 100644
--- a/libio/iofopncook.c
+++ b/libio/iofopncook.c
@@ -28,6 +28,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <shlib-compat.h>
+#include <pointer_guard.h>
 
 static ssize_t
 _IO_cookie_read (FILE *fp, void *buf, ssize_t size)
diff --git a/libio/iofwide.c b/libio/iofwide.c
index 01616e06c7..1ce685f48a 100644
--- a/libio/iofwide.c
+++ b/libio/iofwide.c
@@ -36,7 +36,7 @@ 
 #include <wcsmbs/wcsmbsload.h>
 #include <iconv/gconv_int.h>
 #include <shlib-compat.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 /* Return orientation of stream.  If mode is nonzero try to change
diff --git a/libio/libioP.h b/libio/libioP.h
index ba4fdbd200..dac3de73a1 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -47,6 +47,7 @@ 
 #include "iolibio.h"
 
 #include <shlib-compat.h>
+#include <pointer_guard.h>
 
 /* For historical reasons this is the name of the sysdeps header that
    adjusts the libio configuration.  */
diff --git a/libio/vtables.c b/libio/vtables.c
index 50acab7f21..32459e4fac 100644
--- a/libio/vtables.c
+++ b/libio/vtables.c
@@ -20,6 +20,7 @@ 
 #include <libioP.h>
 #include <stdio.h>
 #include <ldsodefs.h>
+#include <pointer_guard.h>
 
 #ifdef SHARED
 
diff --git a/misc/unwind-link.c b/misc/unwind-link.c
index 9ae9561206..45b7886b46 100644
--- a/misc/unwind-link.c
+++ b/misc/unwind-link.c
@@ -23,6 +23,7 @@ 
 #include <gnu/lib-names.h>
 #include <unwind-link.h>
 #include <libc-lock.h>
+#include <pointer_guard.h>
 
 /* Statically allocate the object, so that we do not have to deal with
    malloc failure.  __libc_unwind_link_get must not fail if libgcc_s
diff --git a/nss/nss_module.c b/nss/nss_module.c
index f00bbd9e1a..9a8f3ddf94 100644
--- a/nss/nss_module.c
+++ b/nss/nss_module.c
@@ -32,7 +32,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Suffix after .so of NSS service modules.  This is a bit of magic,
    but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we
diff --git a/stdlib/cxa_atexit.c b/stdlib/cxa_atexit.c
index 1412dacb07..adf89e93f5 100644
--- a/stdlib/cxa_atexit.c
+++ b/stdlib/cxa_atexit.c
@@ -21,7 +21,7 @@ 
 
 #include <libc-lock.h>
 #include "exit.h"
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #undef __cxa_atexit
 
diff --git a/stdlib/cxa_finalize.c b/stdlib/cxa_finalize.c
index d4db2e1fe0..f2479569a5 100644
--- a/stdlib/cxa_finalize.c
+++ b/stdlib/cxa_finalize.c
@@ -19,7 +19,7 @@ 
 #include <stdlib.h>
 #include "exit.h"
 #include <register-atfork.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 #include <stdint.h>
 
 /* If D is non-NULL, call all functions registered with `__cxa_atexit'
diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c
index 5cc8eb55dd..faacab3990 100644
--- a/stdlib/cxa_thread_atexit_impl.c
+++ b/stdlib/cxa_thread_atexit_impl.c
@@ -75,6 +75,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <ldsodefs.h>
+#include <pointer_guard.h>
 
 typedef void (*dtor_func) (void *);
 
diff --git a/stdlib/exit.c b/stdlib/exit.c
index bc46109f3e..e59156bbf6 100644
--- a/stdlib/exit.c
+++ b/stdlib/exit.c
@@ -18,7 +18,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <sysdep.h>
+#include <pointer_guard.h>
 #include <libc-lock.h>
 #include "exit.h"
 
diff --git a/stdlib/on_exit.c b/stdlib/on_exit.c
index 3e2d640d65..fb59db20ca 100644
--- a/stdlib/on_exit.c
+++ b/stdlib/on_exit.c
@@ -18,7 +18,7 @@ 
 #include <assert.h>
 #include <stdlib.h>
 #include "exit.h"
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Register a function to be called by exit.  */
 int
diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S
index 5f83f9f264..d934e00ec3 100644
--- a/sysdeps/aarch64/__longjmp.S
+++ b/sysdeps/aarch64/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <stap-probe.h>
 
diff --git a/sysdeps/aarch64/jmpbuf-offsets.h b/sysdeps/aarch64/jmpbuf-offsets.h
index 6256bda7a9..78bdd4a539 100644
--- a/sysdeps/aarch64/jmpbuf-offsets.h
+++ b/sysdeps/aarch64/jmpbuf-offsets.h
@@ -43,6 +43,7 @@ 
 #include <setjmp.h>
 #include <stdint.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 static inline uintptr_t __attribute__ ((unused))
 _jmpbuf_sp (__jmp_buf jmpbuf)
diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S
index 3860f4e0ec..2ed2feb488 100644
--- a/sysdeps/aarch64/setjmp.S
+++ b/sysdeps/aarch64/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <stap-probe.h>
 
diff --git a/sysdeps/alpha/__longjmp.S b/sysdeps/alpha/__longjmp.S
index ec7510bb55..aed7a17ed8 100644
--- a/sysdeps/alpha/__longjmp.S
+++ b/sysdeps/alpha/__longjmp.S
@@ -18,6 +18,7 @@ 
 #define __ASSEMBLY__
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 
diff --git a/sysdeps/alpha/jmpbuf-unwind.h b/sysdeps/alpha/jmpbuf-unwind.h
index 13b27990b3..318b73b100 100644
--- a/sysdeps/alpha/jmpbuf-unwind.h
+++ b/sysdeps/alpha/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame containing a local
    variable at ADDRESS.  */
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
index f86367ae08..deb888c072 100644
--- a/sysdeps/alpha/setjmp.S
+++ b/sysdeps/alpha/setjmp.S
@@ -18,6 +18,7 @@ 
 #define __ASSEMBLY__
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 	.ent __sigsetjmp
diff --git a/sysdeps/arc/jmpbuf-unwind.h b/sysdeps/arc/jmpbuf-unwind.h
index 5488707919..e5434a95dd 100644
--- a/sysdeps/arc/jmpbuf-unwind.h
+++ b/sysdeps/arc/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <jmpbuf-offsets.h>
 #include <stdint.h>
 #include <unwind.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S
index 5f1cf3643f..411055b9b3 100644
--- a/sysdeps/arm/__longjmp.S
+++ b/sysdeps/arm/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #include <bits/setjmp.h>
 #include <rtld-global-offsets.h>
diff --git a/sysdeps/arm/jmpbuf-unwind.h b/sysdeps/arm/jmpbuf-unwind.h
index e6b118f4d0..641444eaf3 100644
--- a/sysdeps/arm/jmpbuf-unwind.h
+++ b/sysdeps/arm/jmpbuf-unwind.h
@@ -18,6 +18,7 @@ 
 #include <setjmp.h>
 #include <stdint.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <unwind.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
diff --git a/sysdeps/arm/pointer_guard.h b/sysdeps/arm/pointer_guard.h
new file mode 100644
index 0000000000..6b90cec2f3
--- /dev/null
+++ b/sysdeps/arm/pointer_guard.h
@@ -0,0 +1,67 @@ 
+/* Pointer guard implementation.  Arm version.
+   Copyright (C) 2013-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+/* Pointer mangling support.  */
+#if (IS_IN (rtld) \
+     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE_LOAD(guard, tmp)                                   \
+  LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
+#  define PTR_MANGLE(dst, src, guard, tmp)                              \
+  PTR_MANGLE_LOAD(guard, tmp);                                          \
+  PTR_MANGLE2(dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#  define PTR_MANGLE2(dst, src, guard)          \
+  eor dst, src, guard
+#  define PTR_DEMANGLE(dst, src, guard, tmp)    \
+  PTR_MANGLE (dst, src, guard, tmp)
+#  define PTR_DEMANGLE2(dst, src, guard)        \
+  PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE_LOAD(guard, tmp)                                   \
+  LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
+#  define PTR_MANGLE(dst, src, guard, tmp)                              \
+  PTR_MANGLE_LOAD(guard, tmp);                                          \
+  PTR_MANGLE2(dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#  define PTR_MANGLE2(dst, src, guard)          \
+  eor dst, src, guard
+#  define PTR_DEMANGLE(dst, src, guard, tmp)    \
+  PTR_MANGLE (dst, src, guard, tmp)
+#  define PTR_DEMANGLE2(dst, src, guard)        \
+  PTR_MANGLE2 (dst, src, guard)
+# else
+#  include <stdint.h>
+extern uintptr_t __pointer_chk_guard attribute_relro;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S
index 1c26227437..271454d769 100644
--- a/sysdeps/arm/setjmp.S
+++ b/sysdeps/arm/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #include <bits/setjmp.h>
 #include <rtld-global-offsets.h>
diff --git a/sysdeps/arm/sysdep.h b/sysdeps/arm/sysdep.h
index f19146b85f..ffd848de88 100644
--- a/sysdeps/arm/sysdep.h
+++ b/sysdeps/arm/sysdep.h
@@ -293,47 +293,3 @@ 
 #else
 # define PC_OFS  8
 #endif
-
-/* Pointer mangling support.  */
-#if (IS_IN (rtld) \
-     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE_LOAD(guard, tmp)					\
-  LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
-#  define PTR_MANGLE(dst, src, guard, tmp)				\
-  PTR_MANGLE_LOAD(guard, tmp);						\
-  PTR_MANGLE2(dst, src, guard)
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#  define PTR_MANGLE2(dst, src, guard)		\
-  eor dst, src, guard
-#  define PTR_DEMANGLE(dst, src, guard, tmp)	\
-  PTR_MANGLE (dst, src, guard, tmp)
-#  define PTR_DEMANGLE2(dst, src, guard)	\
-  PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
-# endif
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE_LOAD(guard, tmp)					\
-  LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
-#  define PTR_MANGLE(dst, src, guard, tmp)				\
-  PTR_MANGLE_LOAD(guard, tmp);						\
-  PTR_MANGLE2(dst, src, guard)
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#  define PTR_MANGLE2(dst, src, guard)		\
-  eor dst, src, guard
-#  define PTR_DEMANGLE(dst, src, guard, tmp)	\
-  PTR_MANGLE (dst, src, guard, tmp)
-#  define PTR_DEMANGLE2(dst, src, guard)	\
-  PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
-# endif
-#endif
diff --git a/sysdeps/csky/abiv2/__longjmp.S b/sysdeps/csky/abiv2/__longjmp.S
index 762b2cb47f..bb7da548c2 100644
--- a/sysdeps/csky/abiv2/__longjmp.S
+++ b/sysdeps/csky/abiv2/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 ENTRY (__longjmp)
 	mov	a2, a0
diff --git a/sysdeps/csky/abiv2/setjmp.S b/sysdeps/csky/abiv2/setjmp.S
index 0acf197d02..afef3ce390 100644
--- a/sysdeps/csky/abiv2/setjmp.S
+++ b/sysdeps/csky/abiv2/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 ENTRY (setjmp)
 	movi	a1, 1
diff --git a/sysdeps/csky/jmpbuf-unwind.h b/sysdeps/csky/jmpbuf-unwind.h
index 358e912856..76fca431c6 100644
--- a/sysdeps/csky/jmpbuf-unwind.h
+++ b/sysdeps/csky/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/generic/pointer_guard.h b/sysdeps/generic/pointer_guard.h
new file mode 100644
index 0000000000..58a624e1d5
--- /dev/null
+++ b/sysdeps/generic/pointer_guard.h
@@ -0,0 +1,29 @@ 
+/* Pointer obfuscation implenentation.  Generic (no-op) version.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+/* Assembler code depends on PTR_MANGLE not being defined for
+   optimization purposes.  */
+#ifndef __ASSEMBLER__
+# define PTR_MANGLE(x) (void) (x)
+# define PTR_DEMANGLE(x) (void) (x)
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/generic/unwind-link.h b/sysdeps/generic/unwind-link.h
index 93ee80f3f8..a2076a23bf 100644
--- a/sysdeps/generic/unwind-link.h
+++ b/sysdeps/generic/unwind-link.h
@@ -31,7 +31,7 @@  unwind_arch_adjustment (void *prev, void *addr)
 #endif
 
 #ifdef SHARED
-# include <sysdep.h>
+# include <pointer_guard.h>
 # include <unwind-resume.h>
 
 # if UNWIND_LINK_FRAME_STATE_FOR
diff --git a/sysdeps/i386/__longjmp.S b/sysdeps/i386/__longjmp.S
index 508d370d5c..b67781ceb7 100644
--- a/sysdeps/i386/__longjmp.S
+++ b/sysdeps/i386/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/i386/bsd-_setjmp.S b/sysdeps/i386/bsd-_setjmp.S
index 190e35b0c7..80399dba6e 100644
--- a/sysdeps/i386/bsd-_setjmp.S
+++ b/sysdeps/i386/bsd-_setjmp.S
@@ -21,6 +21,7 @@ 
    in setjmp doesn't clobber the state restored by longjmp.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <stap-probe.h>
diff --git a/sysdeps/i386/bsd-setjmp.S b/sysdeps/i386/bsd-setjmp.S
index 575ac96208..b367bad85f 100644
--- a/sysdeps/i386/bsd-setjmp.S
+++ b/sysdeps/i386/bsd-setjmp.S
@@ -21,6 +21,7 @@ 
    in setjmp doesn't clobber the state restored by longjmp.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <stap-probe.h>
diff --git a/sysdeps/i386/jmpbuf-unwind.h b/sysdeps/i386/jmpbuf-unwind.h
index 416c816b45..73d214fd31 100644
--- a/sysdeps/i386/jmpbuf-unwind.h
+++ b/sysdeps/i386/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/i386/setjmp.S b/sysdeps/i386/setjmp.S
index 217efbdf8a..b528245806 100644
--- a/sysdeps/i386/setjmp.S
+++ b/sysdeps/i386/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
index d6a99fcbc8..4c40ffa158 100644
--- a/sysdeps/loongarch/__longjmp.S
+++ b/sysdeps/loongarch/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <sys/asm.h>
 
 ENTRY (__longjmp)
diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
index 6fa509151d..458edec135 100644
--- a/sysdeps/loongarch/jmpbuf-unwind.h
+++ b/sysdeps/loongarch/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
index 9b1cdea48c..e5f480d453 100644
--- a/sysdeps/loongarch/setjmp.S
+++ b/sysdeps/loongarch/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <sys/asm.h>
 
 ENTRY (_setjmp)
diff --git a/sysdeps/m68k/jmpbuf-unwind.h b/sysdeps/m68k/jmpbuf-unwind.h
index 17e4b859ab..3ee46c050c 100644
--- a/sysdeps/m68k/jmpbuf-unwind.h
+++ b/sysdeps/m68k/jmpbuf-unwind.h
@@ -19,6 +19,7 @@ 
 #include <setjmp.h>
 #include <stdint.h>
 #include <unwind.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/mach/hurd/i386/____longjmp_chk.S b/sysdeps/mach/hurd/i386/____longjmp_chk.S
index 1a019e2e2b..81d297de0c 100644
--- a/sysdeps/mach/hurd/i386/____longjmp_chk.S
+++ b/sysdeps/mach/hurd/i386/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <tcb-offsets.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/mach/hurd/i386/__longjmp.S b/sysdeps/mach/hurd/i386/__longjmp.S
index 72fcc79f4b..22915fb21e 100644
--- a/sysdeps/mach/hurd/i386/__longjmp.S
+++ b/sysdeps/mach/hurd/i386/__longjmp.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <tcb-offsets.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c
index f8938bc6f4..2577fbf3ee 100644
--- a/sysdeps/mach/hurd/jmp-unwind.c
+++ b/sysdeps/mach/hurd/jmp-unwind.c
@@ -22,7 +22,7 @@ 
 #include <hurd/sigpreempt.h>
 #include <assert.h>
 #include <stdint.h>
-
+#include <pointer_guard.h>
 
 #ifndef _JMPBUF_UNWINDS
 #error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS"
diff --git a/sysdeps/microblaze/jmpbuf-unwind.h b/sysdeps/microblaze/jmpbuf-unwind.h
index f23c7581a7..302e950ced 100644
--- a/sysdeps/microblaze/jmpbuf-unwind.h
+++ b/sysdeps/microblaze/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/mips/jmpbuf-unwind.h b/sysdeps/mips/jmpbuf-unwind.h
index 813c24f3b1..28ecffedb0 100644
--- a/sysdeps/mips/jmpbuf-unwind.h
+++ b/sysdeps/mips/jmpbuf-unwind.h
@@ -19,6 +19,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/nios2/__longjmp.S b/sysdeps/nios2/__longjmp.S
index 214901d67d..13695e25a6 100644
--- a/sysdeps/nios2/__longjmp.S
+++ b/sysdeps/nios2/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 /* __longjmp(jmpbuf, val) */
diff --git a/sysdeps/nios2/jmpbuf-offsets.h b/sysdeps/nios2/jmpbuf-offsets.h
index a13aa76c16..76fea64ffe 100644
--- a/sysdeps/nios2/jmpbuf-offsets.h
+++ b/sysdeps/nios2/jmpbuf-offsets.h
@@ -32,6 +32,7 @@ 
 #include <setjmp.h>
 #include <stdint.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 static inline uintptr_t __attribute__ ((unused))
 _jmpbuf_sp (__jmp_buf jmpbuf)
diff --git a/sysdeps/nios2/setjmp.S b/sysdeps/nios2/setjmp.S
index 0aa5b23d4f..ec75108b87 100644
--- a/sysdeps/nios2/setjmp.S
+++ b/sysdeps/nios2/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 	.text
diff --git a/sysdeps/powerpc/jmpbuf-unwind.h b/sysdeps/powerpc/jmpbuf-unwind.h
index 706ceda5d4..93573ce238 100644
--- a/sysdeps/powerpc/jmpbuf-unwind.h
+++ b/sysdeps/powerpc/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/powerpc/powerpc32/__longjmp-common.S b/sysdeps/powerpc/powerpc32/__longjmp-common.S
index 13ded200e2..0e0361e4fd 100644
--- a/sysdeps/powerpc/powerpc32/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/__longjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
index e3937222a7..de04a62be2 100644
--- a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
index f82196e6c2..1943ffd229 100644
--- a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc32/setjmp-common.S b/sysdeps/powerpc/powerpc32/setjmp-common.S
index c632a3f8f2..281dd65f6a 100644
--- a/sysdeps/powerpc/powerpc32/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/setjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S
index 5f629e1e0f..ff3e0beb23 100644
--- a/sysdeps/powerpc/powerpc64/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/__longjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #define _SETJMP_H
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
index 19e76d59ee..75389e4d26 100644
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
diff --git a/sysdeps/riscv/jmpbuf-unwind.h b/sysdeps/riscv/jmpbuf-unwind.h
index 28e73dda55..b411a246d1 100644
--- a/sysdeps/riscv/jmpbuf-unwind.h
+++ b/sysdeps/riscv/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/s390/jmpbuf-unwind.h b/sysdeps/s390/jmpbuf-unwind.h
index b4ff8da6e2..10b37f09c3 100644
--- a/sysdeps/s390/jmpbuf-unwind.h
+++ b/sysdeps/s390/jmpbuf-unwind.h
@@ -21,6 +21,7 @@ 
 #include <unwind.h>
 #include <bits/wordsize.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 
 /* Test if longjmp to JMPBUF would unwind the frame
diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c
index 09a3a2b8f8..83d42329a3 100644
--- a/sysdeps/s390/s390-32/__longjmp.c
+++ b/sysdeps/s390/s390-32/__longjmp.c
@@ -17,6 +17,7 @@ 
 
 #include <errno.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <setjmp.h>
 #include <bits/setjmp.h>
 #include <stdlib.h>
diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S
index c15c7bb99a..08704238f8 100644
--- a/sysdeps/s390/s390-32/setjmp.S
+++ b/sysdeps/s390/s390-32/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c
index 2ca96e1b1b..9fe4939e5e 100644
--- a/sysdeps/s390/s390-64/__longjmp.c
+++ b/sysdeps/s390/s390-64/__longjmp.c
@@ -17,6 +17,7 @@ 
 
 #include <errno.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <setjmp.h>
 #include <bits/setjmp.h>
 #include <stdlib.h>
diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S
index 6dcd77df15..5c59f571a2 100644
--- a/sysdeps/s390/s390-64/setjmp.S
+++ b/sysdeps/s390/s390-64/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
diff --git a/sysdeps/sh/jmpbuf-unwind.h b/sysdeps/sh/jmpbuf-unwind.h
index c6672955ae..1957e5275d 100644
--- a/sysdeps/sh/jmpbuf-unwind.h
+++ b/sysdeps/sh/jmpbuf-unwind.h
@@ -19,6 +19,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S
index 4228b5fef7..f10bed2afe 100644
--- a/sysdeps/sh/sh3/__longjmp.S
+++ b/sysdeps/sh/sh3/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S
index 0dd0003efe..363e16fb15 100644
--- a/sysdeps/sh/sh3/setjmp.S
+++ b/sysdeps/sh/sh3/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 ENTRY (__sigsetjmp)
diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S
index 2013b71794..bc179e4584 100644
--- a/sysdeps/sh/sh4/__longjmp.S
+++ b/sysdeps/sh/sh4/__longjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S
index b73aa3c18c..f28ec42091 100644
--- a/sysdeps/sh/sh4/setjmp.S
+++ b/sysdeps/sh/sh4/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 ENTRY (__sigsetjmp)
diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S
index 5bed2440ac..68b3b15cb1 100644
--- a/sysdeps/sparc/sparc32/__longjmp.S
+++ b/sysdeps/sparc/sparc32/__longjmp.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 #include <jmpbuf-offsets.h>
 #define ENV(base,reg) [%base + (reg * 4)]
diff --git a/sysdeps/sparc/sparc32/jmpbuf-unwind.h b/sysdeps/sparc/sparc32/jmpbuf-unwind.h
index 3ab5088555..8b697ed95b 100644
--- a/sysdeps/sparc/sparc32/jmpbuf-unwind.h
+++ b/sysdeps/sparc/sparc32/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S
index 9c7531bc95..c4e29c47b9 100644
--- a/sysdeps/sparc/sparc32/setjmp.S
+++ b/sysdeps/sparc/sparc32/setjmp.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <sys/trap.h>
 
 #include <jmpbuf-offsets.h>
diff --git a/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
new file mode 100644
index 0000000000..b81c9075f3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
@@ -0,0 +1,68 @@ 
+/* Pointer guard implementation.  AArch64 version.
+   Copyright (C) 2014-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+/* Pointer mangling is supported for AArch64.  */
+#if (IS_IN (rtld) \
+     || (!defined SHARED && (IS_IN (libc) \
+                             || IS_IN (libpthread))))
+# ifdef __ASSEMBLER__
+/* Note, dst, src, guard, and tmp are all register numbers rather than
+   register names so they will work with both ILP32 and LP64. */
+#  define PTR_MANGLE(dst, src, guard, tmp)                                \
+  LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
+  PTR_MANGLE2 (dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#  define PTR_MANGLE2(dst, src, guard)\
+  eor x##dst, x##src, x##guard
+#  define PTR_DEMANGLE(dst, src, guard, tmp)\
+  PTR_MANGLE (dst, src, guard, tmp)
+#  define PTR_DEMANGLE2(dst, src, guard)\
+  PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#else
+# ifdef __ASSEMBLER__
+/* Note, dst, src, guard, and tmp are all register numbers rather than
+   register names so they will work with both ILP32 and LP64. */
+#  define PTR_MANGLE(dst, src, guard, tmp)                             \
+  LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));   \
+  PTR_MANGLE2 (dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#  define PTR_MANGLE2(dst, src, guard)\
+  eor x##dst, x##src, x##guard
+#  define PTR_DEMANGLE(dst, src, guard, tmp)\
+  PTR_MANGLE (dst, src, guard, tmp)
+#  define PTR_DEMANGLE2(dst, src, guard)\
+  PTR_MANGLE2 (dst, src, guard)
+# else
+#  include <stdint.h>
+extern uintptr_t __pointer_chk_guard attribute_relro;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
index f1853e012f..8ba50dab8f 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
@@ -233,49 +233,4 @@ 
 
 #endif	/* __ASSEMBLER__ */
 
-/* Pointer mangling is supported for AArch64.  */
-#if (IS_IN (rtld) \
-     || (!defined SHARED && (IS_IN (libc) \
-			     || IS_IN (libpthread))))
-# ifdef __ASSEMBLER__
-/* Note, dst, src, guard, and tmp are all register numbers rather than
-   register names so they will work with both ILP32 and LP64. */
-#  define PTR_MANGLE(dst, src, guard, tmp)                                \
-  LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
-  PTR_MANGLE2 (dst, src, guard)
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#  define PTR_MANGLE2(dst, src, guard)\
-  eor x##dst, x##src, x##guard
-#  define PTR_DEMANGLE(dst, src, guard, tmp)\
-  PTR_MANGLE (dst, src, guard, tmp)
-#  define PTR_DEMANGLE2(dst, src, guard)\
-  PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
-# endif
-#else
-# ifdef __ASSEMBLER__
-/* Note, dst, src, guard, and tmp are all register numbers rather than
-   register names so they will work with both ILP32 and LP64. */
-#  define PTR_MANGLE(dst, src, guard, tmp)                             \
-  LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));   \
-  PTR_MANGLE2 (dst, src, guard)
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#  define PTR_MANGLE2(dst, src, guard)\
-  eor x##dst, x##src, x##guard
-#  define PTR_DEMANGLE(dst, src, guard, tmp)\
-  PTR_MANGLE (dst, src, guard, tmp)
-#  define PTR_DEMANGLE2(dst, src, guard)\
-  PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/aarch64/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
index 610f401d45..566a3b0211 100644
--- a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 
diff --git a/sysdeps/unix/sysv/linux/alpha/pointer_guard.h b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h
new file mode 100644
index 0000000000..d4d513d816
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h
@@ -0,0 +1,62 @@ 
+/* Pointer guard implementation.  Alpha version.
+   Copyright (C) 2006-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+/* Pointer mangling support.  Note that tls access is slow enough that
+   we don't deoptimize things by placing the pointer check value there.  */
+
+#ifdef __ASSEMBLER__
+# if IS_IN (rtld)
+#  define PTR_MANGLE(dst, src, tmp)                             \
+        ldah    tmp, __pointer_chk_guard_local($29) !gprelhigh; \
+        ldq     tmp, __pointer_chk_guard_local(tmp) !gprellow;  \
+        xor     src, tmp, dst
+#  define PTR_MANGLE2(dst, src, tmp)                            \
+        xor     src, tmp, dst
+# elif defined SHARED
+#  define PTR_MANGLE(dst, src, tmp)             \
+        ldq     tmp, __pointer_chk_guard;       \
+        xor     src, tmp, dst
+# else
+#  define PTR_MANGLE(dst, src, tmp)             \
+        ldq     tmp, __pointer_chk_guard_local; \
+        xor     src, tmp, dst
+# endif
+# define PTR_MANGLE2(dst, src, tmp)             \
+        xor     src, tmp, dst
+# define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
+# define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
+#else
+# include <stdint.h>
+# if (IS_IN (rtld) \
+      || (!defined SHARED && (IS_IN (libc) \
+                              || IS_IN (libpthread))))
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+#  define PTR_MANGLE(var) \
+        (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+# else
+extern uintptr_t __pointer_chk_guard attribute_relro;
+#  define PTR_MANGLE(var) \
+        (var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+# endif
+# define PTR_DEMANGLE(var)  PTR_MANGLE(var)
+#endif /* ASSEMBLER */
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
index 77ec2b5400..0ddcb58b30 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
@@ -313,44 +313,4 @@  __LABEL(name)						\
 })
 #endif /* ASSEMBLER */
 
-/* Pointer mangling support.  Note that tls access is slow enough that
-   we don't deoptimize things by placing the pointer check value there.  */
-
-#ifdef __ASSEMBLER__
-# if IS_IN (rtld)
-#  define PTR_MANGLE(dst, src, tmp)				\
-	ldah	tmp, __pointer_chk_guard_local($29) !gprelhigh;	\
-	ldq	tmp, __pointer_chk_guard_local(tmp) !gprellow;	\
-	xor	src, tmp, dst
-#  define PTR_MANGLE2(dst, src, tmp)				\
-	xor	src, tmp, dst
-# elif defined SHARED
-#  define PTR_MANGLE(dst, src, tmp)		\
-	ldq	tmp, __pointer_chk_guard;	\
-	xor	src, tmp, dst
-# else
-#  define PTR_MANGLE(dst, src, tmp)		\
-	ldq	tmp, __pointer_chk_guard_local;	\
-	xor	src, tmp, dst
-# endif
-# define PTR_MANGLE2(dst, src, tmp)		\
-	xor	src, tmp, dst
-# define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
-# define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
-#else
-# include <stdint.h>
-# if (IS_IN (rtld) \
-      || (!defined SHARED && (IS_IN (libc) \
-			      || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-#  define PTR_MANGLE(var) \
-	(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-#  define PTR_MANGLE(var) \
-	(var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var)  PTR_MANGLE(var)
-#endif /* ASSEMBLER */
-
 #endif /* _LINUX_ALPHA_SYSDEP_H  */
diff --git a/sysdeps/unix/sysv/linux/arc/sysdep.h b/sysdeps/unix/sysv/linux/arc/sysdep.h
index d0c1a78381..512284a705 100644
--- a/sysdeps/unix/sysv/linux/arc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/arc/sysdep.h
@@ -215,10 +215,6 @@  hidden_proto (__syscall_error)
   LOAD_ARGS_6 (nm, arg1, arg2, arg3, arg4, arg5, arg6)	\
   register long int _arg7 __asm__ ("r6") = _tmp7;
 
-/* Pointer mangling not yet supported.  */
-# define PTR_MANGLE(var) (void) (var)
-# define PTR_DEMANGLE(var) (void) (var)
-
 # undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
 # define HAVE_INTERNAL_BRK_ADDR_SYMBOL  1
 
diff --git a/sysdeps/unix/sysv/linux/csky/pointer_guard.h b/sysdeps/unix/sysv/linux/csky/pointer_guard.h
new file mode 100644
index 0000000000..ed683220c9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/pointer_guard.h
@@ -0,0 +1,68 @@ 
+/* Pointer obfuscation implenentation.  C-SKY version.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if (IS_IN (rtld) \
+     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dst, src, guard)                   \
+        grs     t0, 1f;                                 \
+1:                                                      \
+        lrw     guard, 1b@GOTPC;                        \
+        addu    t0, guard;                              \
+        lrw     guard, __pointer_chk_guard_local@GOT;   \
+        ldr.w   guard, (t0, guard << 0);                \
+        ldw     guard, (guard, 0);                      \
+        xor     dst, src, guard;
+#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
+#  define PTR_MANGLE2(dst, src, guard) \
+        xor     dst, src, guard
+#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard_local;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dst, src, guard)           \
+        grs     t0, 1f;                         \
+1:                                              \
+        lrw     guard, 1b@GOTPC;                \
+        addu    t0, guard;                      \
+        lrw     guard, __pointer_chk_guard@GOT; \
+        ldr.w   guard, (t0, guard << 0);        \
+        ldw     guard, (guard, 0);              \
+        xor     dst, src, guard;
+#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
+#  define PTR_MANGLE2(dst, src, guard) \
+        xor     dst, src, guard
+#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
+# else
+# include <stdint.h>
+extern uintptr_t __pointer_chk_guard;
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.h b/sysdeps/unix/sysv/linux/csky/sysdep.h
index 56c527fa8b..76b09f0cc6 100644
--- a/sysdeps/unix/sysv/linux/csky/sysdep.h
+++ b/sysdeps/unix/sysv/linux/csky/sysdep.h
@@ -466,50 +466,4 @@  __local_syscall_error:				\
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if (IS_IN (rtld) \
-     || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(dst, src, guard)			\
-	grs	t0, 1f;					\
-1:							\
-	lrw	guard, 1b@GOTPC;			\
-	addu	t0, guard;				\
-	lrw	guard, __pointer_chk_guard_local@GOT;	\
-	ldr.w	guard, (t0, guard << 0);		\
-	ldw	guard, (guard, 0);			\
-	xor	dst, src, guard;
-#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
-#  define PTR_MANGLE2(dst, src, guard) \
-	xor	dst, src, guard
-#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard_local;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(dst, src, guard)		\
-	grs	t0, 1f;				\
-1:						\
-	lrw	guard, 1b@GOTPC;		\
-	addu	t0, guard;			\
-	lrw	guard, __pointer_chk_guard@GOT;	\
-	ldr.w	guard, (t0, guard << 0);	\
-	ldw	guard, (guard, 0);		\
-	xor	dst, src, guard;
-#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
-#  define PTR_MANGLE2(dst, src, guard) \
-	xor	dst, src, guard
-#  define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
-# else
-extern uintptr_t __pointer_chk_guard;
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-#  define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/csky/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h
index 2f339a4bd6..3aef8f536a 100644
--- a/sysdeps/unix/sysv/linux/hppa/sysdep.h
+++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h
@@ -470,8 +470,4 @@  L(pre_end):					ASM_LINE_SEP	\
 
 #endif	/* __ASSEMBLER__ */
 
-/* Pointer mangling is not yet supported for HPPA.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 #endif /* _LINUX_HPPA_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
index a1cf9a4b21..f409542a62 100644
--- a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/unix/sysv/linux/i386/pointer_guard.h b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
new file mode 100644
index 0000000000..a2d2a0c38b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
@@ -0,0 +1,49 @@ 
+/* Pointer obfuscation implenentation.  i386 version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#include <tcb-offsets.h>
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  Using a global variable
+   is too complicated here since we have no PC-relative addressing mode.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg)       xorl %gs:POINTER_GUARD, reg;                  \
+                                roll $9, reg
+#  define PTR_DEMANGLE(reg)     rorl $9, reg;                                 \
+                                xorl %gs:POINTER_GUARD, reg
+# else
+#  define PTR_MANGLE(var)       asm ("xorl %%gs:%c2, %0\n"                    \
+                                     "roll $9, %0"                            \
+                                     : "=r" (var)                             \
+                                     : "0" (var),                             \
+                                       "i" (POINTER_GUARD))
+#  define PTR_DEMANGLE(var)     asm ("rorl $9, %0\n"                          \
+                                     "xorl %%gs:%c2, %0"                      \
+                                     : "=r" (var)                             \
+                                     : "0" (var),                             \
+                                       "i" (POINTER_GUARD))
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 7085f7e19a..b8be668a42 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -446,34 +446,6 @@  struct libc_do_syscall_args
 
 #endif	/* __ASSEMBLER__ */
 
-
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  Using a global variable
-   is too complicated here since we have no PC-relative addressing mode.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg)	xorl %gs:POINTER_GUARD, reg;		      \
-				roll $9, reg
-#  define PTR_DEMANGLE(reg)	rorl $9, reg;				      \
-				xorl %gs:POINTER_GUARD, reg
-# else
-#  define PTR_MANGLE(var)	asm ("xorl %%gs:%c2, %0\n"		      \
-				     "roll $9, %0"			      \
-				     : "=r" (var)			      \
-				     : "0" (var),			      \
-				       "i" (offsetof (tcbhead_t,	      \
-						      pointer_guard)))
-#  define PTR_DEMANGLE(var)	asm ("rorl $9, %0\n"			      \
-				     "xorl %%gs:%c2, %0"		      \
-				     : "=r" (var)			      \
-				     : "0" (var),			      \
-				       "i" (offsetof (tcbhead_t,	      \
-						      pointer_guard)))
-# endif
-#endif
-
 /* Each shadow stack slot takes 4 bytes.  Assuming that each stack
    frame takes 128 bytes, this is used to compute shadow stack size
    from stack size.  */
diff --git a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
index 9511c15945..4ef5129623 100644
--- a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
+++ b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S
@@ -15,6 +15,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <features.h>
 
 LEAF(__ia64_flush_rbs)
diff --git a/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
index 793dc98cc1..da9653d8a7 100644
--- a/sysdeps/unix/sysv/linux/ia64/__longjmp.S
+++ b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
@@ -31,6 +31,7 @@ 
 		bits into ar.rnat after setting ar.bspstore. */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <features.h>
 
 #	define	pPos	p6	/* is rotate count positive? */
diff --git a/sysdeps/unix/sysv/linux/ia64/pointer_guard.h b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h
new file mode 100644
index 0000000000..8631f39374
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h
@@ -0,0 +1,44 @@ 
+/* Pointer obfuscation implenentation.  ia64 version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg, tmpreg) \
+        add     tmpreg=-16,r13          \
+        ;;                              \
+        ld8     tmpreg=[tmpreg]         \
+        ;;                              \
+        xor     reg=reg, tmpreg
+#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/ia64/setjmp.S b/sysdeps/unix/sysv/linux/ia64/setjmp.S
index c29a31f7a6..a978dd4360 100644
--- a/sysdeps/unix/sysv/linux/ia64/setjmp.S
+++ b/sysdeps/unix/sysv/linux/ia64/setjmp.S
@@ -63,6 +63,7 @@ 
 	0x1c0	f31 */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <features.h>
 
 	/* The following two entry points are the traditional entry points: */
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h
index 14adbdf4ff..b450c6c224 100644
--- a/sysdeps/unix/sysv/linux/ia64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h
@@ -324,24 +324,4 @@ 
 
 #endif /* not __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg, tmpreg) \
-        add	tmpreg=-16,r13		\
-        ;;				\
-        ld8	tmpreg=[tmpreg]		\
-        ;;				\
-        xor	reg=reg, tmpreg
-#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/ia64/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
new file mode 100644
index 0000000000..4b2ed46167
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
@@ -0,0 +1,82 @@ 
+/* Pointer obfuscation implenentation.  LoongArch version.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+/* Load a got-relative EXPR into G, using T.
+   Note G and T are register names.  */
+#define LD_GLOBAL(G, EXPR) \
+  la.global G,  EXPR; \
+  REG_L     G,  G,  0;
+
+/* Load a pc-relative EXPR into G, using T.
+   Note G and T are register names.  */
+#define LD_PCREL(G, EXPR) \
+  la.pcrel  G,  EXPR; \
+  REG_L     G,  G,  0;
+
+#if (IS_IN (rtld) \
+     || (!defined SHARED && (IS_IN (libc) \
+     || IS_IN (libpthread))))
+
+#ifdef __ASSEMBLER__
+#define PTR_MANGLE(dst, src, guard) \
+  LD_PCREL (guard, __pointer_chk_guard_local); \
+  PTR_MANGLE2 (dst, src, guard);
+#define PTR_DEMANGLE(dst, src, guard) \
+  LD_PCREL (guard, __pointer_chk_guard_local); \
+  PTR_DEMANGLE2 (dst, src, guard);
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#define PTR_MANGLE2(dst, src, guard) \
+  xor  dst, src, guard;
+#define PTR_DEMANGLE2(dst, src, guard) \
+  PTR_MANGLE2 (dst, src, guard);
+#else
+# include <stdint.h>
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+#define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+#define PTR_DEMANGLE(var) PTR_MANGLE (var)
+#endif
+
+#else
+
+#ifdef __ASSEMBLER__
+#define PTR_MANGLE(dst, src, guard) \
+  LD_GLOBAL (guard, __pointer_chk_guard); \
+  PTR_MANGLE2 (dst, src, guard);
+#define PTR_DEMANGLE(dst, src, guard) \
+  LD_GLOBAL (guard, __pointer_chk_guard); \
+  PTR_DEMANGLE2 (dst, src, guard);
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
+#define PTR_MANGLE2(dst, src, guard) \
+  xor dst, src, guard;
+#define PTR_DEMANGLE2(dst, src, guard) \
+  PTR_MANGLE2 (dst, src, guard);
+#else
+# include <stdint.h>
+extern uintptr_t __pointer_chk_guard attribute_relro;
+#define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+#define PTR_DEMANGLE(var) PTR_MANGLE (var)
+#endif
+
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
index f4a1d23a97..09f8243f25 100644
--- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
@@ -314,64 +314,4 @@  extern long int __syscall_error (long int neg_errno);
 
 #endif /* ! __ASSEMBLER__ */
 
-/* Pointer mangling is supported for LoongArch.  */
-
-/* Load a got-relative EXPR into G, using T.
-   Note G and T are register names.  */
-#define LD_GLOBAL(G, EXPR) \
-  la.global G,	EXPR; \
-  REG_L	    G,	G,  0;
-
-/* Load a pc-relative EXPR into G, using T.
-   Note G and T are register names.  */
-#define LD_PCREL(G, EXPR) \
-  la.pcrel  G,	EXPR; \
-  REG_L	    G,	G,  0;
-
-#if (IS_IN (rtld) \
-     || (!defined SHARED && (IS_IN (libc) \
-     || IS_IN (libpthread))))
-
-#ifdef __ASSEMBLER__
-#define PTR_MANGLE(dst, src, guard) \
-  LD_PCREL (guard, __pointer_chk_guard_local); \
-  PTR_MANGLE2 (dst, src, guard);
-#define PTR_DEMANGLE(dst, src, guard) \
-  LD_PCREL (guard, __pointer_chk_guard_local); \
-  PTR_DEMANGLE2 (dst, src, guard);
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#define PTR_MANGLE2(dst, src, guard) \
-  xor  dst, src, guard;
-#define PTR_DEMANGLE2(dst, src, guard) \
-  PTR_MANGLE2 (dst, src, guard);
-#else
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-#define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-#define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#else
-
-#ifdef __ASSEMBLER__
-#define PTR_MANGLE(dst, src, guard) \
-  LD_GLOBAL (guard, __pointer_chk_guard); \
-  PTR_MANGLE2 (dst, src, guard);
-#define PTR_DEMANGLE(dst, src, guard) \
-  LD_GLOBAL (guard, __pointer_chk_guard); \
-  PTR_DEMANGLE2 (dst, src, guard);
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
-#define PTR_MANGLE2(dst, src, guard) \
-  xor dst, src, guard;
-#define PTR_DEMANGLE2(dst, src, guard) \
-  PTR_MANGLE2 (dst, src, guard);
-#else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-#define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-#define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif
-
 #endif /* linux/loongarch/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h
index d87892a377..064240330a 100644
--- a/sysdeps/unix/sysv/linux/m68k/sysdep.h
+++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h
@@ -295,10 +295,6 @@  SYSCALL_ERROR_LABEL:							      \
 
 #endif /* not __ASSEMBLER__ */
 
-/* Pointer mangling is not yet supported for M68K.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 /* M68K needs system-supplied DSO to access TLS helpers
    even when statically linked.  */
 #define NEED_STATIC_SYSINFO_DSO 1
diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep.h b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
index fda78f6467..19805f6b5d 100644
--- a/sysdeps/unix/sysv/linux/microblaze/sysdep.h
+++ b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
@@ -304,10 +304,6 @@  SYSCALL_ERROR_LABEL_DCL:                            \
   })
 
 
-/* Pointer mangling is not yet supported for Microblaze.  */
-# define PTR_MANGLE(var) (void) (var)
-# define PTR_DEMANGLE(var) (void) (var)
-
 #undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
 #define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1
 
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
index a2a93bc840..0ef410c3c9 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
@@ -337,8 +337,4 @@  libc_hidden_proto (__mips_syscall7, nomips16)
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling is not yet supported for MIPS.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 #endif /* linux/mips/mips32/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
index 2c16a6758d..e362f15300 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
@@ -300,8 +300,4 @@  typedef long int __syscall_arg_t;
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling is not yet supported for MIPS.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 #endif /* linux/mips/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/nios2/pointer_guard.h b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h
new file mode 100644
index 0000000000..da17809592
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h
@@ -0,0 +1,40 @@ 
+/* Pointer obfuscation implenentation.  Nios II version.
+   Copyright (C) 2015-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
+#  define PTR_MANGLE(dst, src, guard) xor dst, src, guard
+#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep.h b/sysdeps/unix/sysv/linux/nios2/sysdep.h
index 5fe960c2a5..46667b9c19 100644
--- a/sysdeps/unix/sysv/linux/nios2/sysdep.h
+++ b/sysdeps/unix/sysv/linux/nios2/sysdep.h
@@ -220,21 +220,4 @@ 
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
-#  define PTR_MANGLE(dst, src, guard) xor dst, src, guard
-#  define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
-
 #endif /* linux/nios2/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/or1k/sysdep.h b/sysdeps/unix/sysv/linux/or1k/sysdep.h
index 941c934554..b1fdf2a806 100644
--- a/sysdeps/unix/sysv/linux/or1k/sysdep.h
+++ b/sysdeps/unix/sysv/linux/or1k/sysdep.h
@@ -119,10 +119,6 @@  L(pseudo_end): \
 
 extern long int __syscall_error (long int neg_errno);
 
-/* Pointer mangling is not yet supported for or1k.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 #undef INTERNAL_SYSCALL
 #define INTERNAL_SYSCALL(name, nr, args...) \
 	INTERNAL_SYSCALL_NCS (SYS_ify (name), nr, args)
diff --git a/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
new file mode 100644
index 0000000000..5961793c0d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h
@@ -0,0 +1,55 @@ 
+/* Pointer obfuscation implenentation.  PowerpC version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  if defined(__PPC64__) || defined(__powerpc64__)
+#   define LOAD  ld
+#   define TPREG r13
+#  else
+#   define LOAD  lwz
+#   define TPREG r2
+#  endif
+#  define PTR_MANGLE(reg, tmpreg) \
+        LOAD    tmpreg,POINTER_GUARD(TPREG); \
+        xor     reg,tmpreg,reg
+#  define PTR_MANGLE2(reg, tmpreg) \
+        xor     reg,tmpreg,reg
+#  define PTR_MANGLE3(destreg, reg, tmpreg) \
+        LOAD    tmpreg,POINTER_GUARD(TPREG); \
+        xor     destreg,tmpreg,reg
+#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
+#  define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
+#  define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
index 4fb135aa8d..9e44818978 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
@@ -207,38 +207,6 @@ 
 #define ASM_INPUT_5 ASM_INPUT_4, "5" (r7)
 #define ASM_INPUT_6 ASM_INPUT_5, "6" (r8)
 
-
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-# ifdef __ASSEMBLER__
-#  if defined(__PPC64__) || defined(__powerpc64__)
-#   define LOAD  ld
-#   define TPREG r13
-#  else
-#   define LOAD  lwz
-#   define TPREG r2
-#  endif
-#  define PTR_MANGLE(reg, tmpreg) \
-	LOAD	tmpreg,POINTER_GUARD(TPREG); \
-	xor	reg,tmpreg,reg
-#  define PTR_MANGLE2(reg, tmpreg) \
-	xor	reg,tmpreg,reg
-#  define PTR_MANGLE3(destreg, reg, tmpreg) \
-	LOAD	tmpreg,POINTER_GUARD(TPREG); \
-	xor	destreg,tmpreg,reg
-#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-#  define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
-#  define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
 /* List of system calls which are supported as vsyscalls.  */
 #define VDSO_NAME  "LINUX_2.6.15"
 #define VDSO_HASH  123718565
diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h
index 9b03b10567..c9af888132 100644
--- a/sysdeps/unix/sysv/linux/riscv/sysdep.h
+++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h
@@ -357,8 +357,4 @@  extern long int __syscall_error (long int neg_errno);
 
 #endif /* ! __ASSEMBLER__ */
 
-/* Pointer mangling is not supported.  */
-#define PTR_MANGLE(var) (void) (var)
-#define PTR_DEMANGLE(var) (void) (var)
-
 #endif /* linux/riscv/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
new file mode 100644
index 0000000000..0e85d4ccbb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h
@@ -0,0 +1,45 @@ 
+/* Pointer obfuscation implenentation.  s390 version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+/* For the time being just use stack_guard rather than a separate
+   pointer_guard.  */
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg, tmpreg) \
+  ear     tmpreg,%a0;                   \
+  x       reg,STACK_GUARD(tmpreg)
+#  define PTR_MANGLE2(reg, tmpreg) \
+  x       reg,STACK_GUARD(tmpreg)
+#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
index e41106b377..a24fde7c6d 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
@@ -177,25 +177,4 @@ 
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-/* For the time being just use stack_guard rather than a separate
-   pointer_guard.  */
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg, tmpreg) \
-  ear     tmpreg,%a0;			\
-  x       reg,STACK_GUARD(tmpreg)
-#  define PTR_MANGLE2(reg, tmpreg) \
-  x       reg,STACK_GUARD(tmpreg)
-#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* _LINUX_S390_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
new file mode 100644
index 0000000000..5285456806
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h
@@ -0,0 +1,47 @@ 
+/* Pointer obfuscation implenentation.  s390x version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+/* For the time being just use stack_guard rather than a separate
+   pointer_guard.  */
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg, tmpreg) \
+  ear     tmpreg,%a0;			\
+  sllg    tmpreg,tmpreg,32;		\
+  ear     tmpreg,%a1;			\
+  xg      reg,STACK_GUARD(tmpreg)
+#  define PTR_MANGLE2(reg, tmpreg) \
+  xg      reg,STACK_GUARD(tmpreg)
+#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
index 150e33981a..79bc0fa4a6 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
@@ -175,27 +175,4 @@ 
 
 #endif /* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-/* For the time being just use stack_guard rather than a separate
-   pointer_guard.  */
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg, tmpreg) \
-  ear     tmpreg,%a0;			\
-  sllg    tmpreg,tmpreg,32;		\
-  ear     tmpreg,%a1;			\
-  xg      reg,STACK_GUARD(tmpreg)
-#  define PTR_MANGLE2(reg, tmpreg) \
-  xg      reg,STACK_GUARD(tmpreg)
-#  define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* _LINUX_S390_SYSDEP_H */
diff --git a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
index e821e158c4..cf69926316 100644
--- a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 #include <sigaltstack-offsets.h>
 
diff --git a/sysdeps/unix/sysv/linux/sh/pointer_guard.h b/sysdeps/unix/sysv/linux/sh/pointer_guard.h
new file mode 100644
index 0000000000..32a571d496
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sh/pointer_guard.h
@@ -0,0 +1,43 @@ 
+/* Pointer obfuscation implenentation.  Generic (no-op) version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  Using a global variable
+   is too complicated here since we have no PC-relative addressing mode.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg, tmp) \
+     stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
+#  define PTR_MANGLE2(reg, tmp) xor tmp,reg
+#  define PTR_DEMANGLE(reg, tmp)        PTR_MANGLE (reg, tmp)
+#  define PTR_DEMANGLE2(reg, tmp)       PTR_MANGLE2 (reg, tmp)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+     (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
index e9e13cd184..a2f43f68c3 100644
--- a/sysdeps/unix/sysv/linux/sh/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sh/sysdep.h
@@ -315,23 +315,4 @@ 
 
 #endif	/* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  Using a global variable
-   is too complicated here since we have no PC-relative addressing mode.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg, tmp) \
-     stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
-#  define PTR_MANGLE2(reg, tmp)	xor tmp,reg
-#  define PTR_DEMANGLE(reg, tmp)	PTR_MANGLE (reg, tmp)
-#  define PTR_DEMANGLE2(reg, tmp)	PTR_MANGLE2 (reg, tmp)
-# else
-#  define PTR_MANGLE(var) \
-     (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)	PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/sh/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
index 8e8cb4d751..ad23840bcd 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 
 #define ENV(base,reg) [%base + (reg * 4)]
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
new file mode 100644
index 0000000000..4063513cd8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h
@@ -0,0 +1,44 @@ 
+/* Pointer obfuscation implenentation.  32-bit SPARC version.
+   Copyright (C) 2006-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dreg, reg, tmpreg) \
+  ld    [%g7 + POINTER_GUARD], tmpreg; \
+  xor   reg, tmpreg, dreg
+#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
+#  define PTR_MANGLE2(dreg, reg, tmpreg) \
+  xor   reg, tmpreg, dreg
+#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index 032608a4e0..1783af8178 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -125,24 +125,4 @@  ENTRY(name);					\
 
 #endif	/* __ASSEMBLER__ */
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(dreg, reg, tmpreg) \
-  ld	[%g7 + POINTER_GUARD], tmpreg; \
-  xor	reg, tmpreg, dreg
-#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
-#  define PTR_MANGLE2(dreg, reg, tmpreg) \
-  xor	reg, tmpreg, dreg
-#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/sparc/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
new file mode 100644
index 0000000000..7865e87c73
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h
@@ -0,0 +1,44 @@ 
+/* Pointer obfuscation implenentation.  64-bit SPARC version.
+   Copyright (C) 2006-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# include <sysdeps/generic/pointer_guard.h>
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dreg, reg, tmpreg) \
+  ldx   [%g7 + POINTER_GUARD], tmpreg; \
+  xor   reg, tmpreg, dreg
+#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
+#  define PTR_MANGLE2(dreg, reg, tmpreg) \
+  xor   reg, tmpreg, dreg
+#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+# else
+#  include <stdint.h>
+#  include <tls.h>
+#  define PTR_MANGLE(var) \
+  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
+#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
index 4aaa2912ce..4ae22ae25b 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
@@ -127,24 +127,4 @@  ENTRY(name);					\
    register windows.  So if you poke stack memory directly you add this.  */
 #define STACK_BIAS	2047
 
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(dreg, reg, tmpreg) \
-  ldx	[%g7 + POINTER_GUARD], tmpreg; \
-  xor	reg, tmpreg, dreg
-#  define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
-#  define PTR_MANGLE2(dreg, reg, tmpreg) \
-  xor	reg, tmpreg, dreg
-#  define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
-# else
-#  define PTR_MANGLE(var) \
-  (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
-#  define PTR_DEMANGLE(var)     PTR_MANGLE (var)
-# endif
-#endif
-
 #endif /* linux/sparc64/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
index ffdf4624bf..5ff275c436 100644
--- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <asm-syntax.h>
 #include <stap-probe.h>
diff --git a/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
new file mode 100644
index 0000000000..2df3912897
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
@@ -0,0 +1,61 @@ 
+/* Pointer obfuscation implenentation.  x86-64 version.
+   Copyright (C) 2005-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef POINTER_GUARD_H
+#define POINTER_GUARD_H
+
+#include <x86-lp_size.h>
+#include <tcb-offsets.h>
+
+#if IS_IN (rtld)
+/* We cannot use the thread descriptor because in ld.so we use setjmp
+   earlier than the descriptor is initialized.  */
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg)       xor __pointer_chk_guard_local(%rip), reg;    \
+                                rol $2*LP_SIZE+1, reg
+#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                       \
+                                xor __pointer_chk_guard_local(%rip), reg
+# else
+#  define PTR_MANGLE(reg)       asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \
+                                     "rol $2*" LP_SIZE "+1, %0"                   \
+                                     : "=r" (reg) : "0" (reg))
+#  define PTR_DEMANGLE(reg)     asm ("ror $2*" LP_SIZE "+1, %0\n"                 \
+                                     "xor __pointer_chk_guard_local(%%rip), %0"   \
+                                     : "=r" (reg) : "0" (reg))
+# endif
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg)       xor %fs:POINTER_GUARD, reg;                   \
+                                rol $2*LP_SIZE+1, reg
+#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                        \
+                                xor %fs:POINTER_GUARD, reg
+# else
+#  define PTR_MANGLE(var)       asm ("xor %%fs:%c2, %0\n"                     \
+                                     "rol $2*" LP_SIZE "+1, %0"               \
+                                     : "=r" (var)                             \
+                                     : "0" (var),                             \
+                                       "i" (POINTER_GUARD))
+#  define PTR_DEMANGLE(var)     asm ("ror $2*" LP_SIZE "+1, %0\n"             \
+                                     "xor %%fs:%c2, %0"                       \
+                                     : "=r" (var)                             \
+                                     : "0" (var),                             \
+                                       "i" (POINTER_GUARD))
+# endif
+#endif
+
+#endif /* POINTER_GUARD_H */
diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index 740abefcfd..5e4d7827d7 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -381,46 +381,6 @@ 
 
 #endif	/* __ASSEMBLER__ */
 
-
-/* Pointer mangling support.  */
-#if IS_IN (rtld)
-/* We cannot use the thread descriptor because in ld.so we use setjmp
-   earlier than the descriptor is initialized.  */
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg)	xor __pointer_chk_guard_local(%rip), reg;    \
-				rol $2*LP_SIZE+1, reg
-#  define PTR_DEMANGLE(reg)	ror $2*LP_SIZE+1, reg;			     \
-				xor __pointer_chk_guard_local(%rip), reg
-# else
-#  define PTR_MANGLE(reg)	asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \
-				     "rol $2*" LP_SIZE "+1, %0"			  \
-				     : "=r" (reg) : "0" (reg))
-#  define PTR_DEMANGLE(reg)	asm ("ror $2*" LP_SIZE "+1, %0\n"		  \
-				     "xor __pointer_chk_guard_local(%%rip), %0"   \
-				     : "=r" (reg) : "0" (reg))
-# endif
-#else
-# ifdef __ASSEMBLER__
-#  define PTR_MANGLE(reg)	xor %fs:POINTER_GUARD, reg;		      \
-				rol $2*LP_SIZE+1, reg
-#  define PTR_DEMANGLE(reg)	ror $2*LP_SIZE+1, reg;			      \
-				xor %fs:POINTER_GUARD, reg
-# else
-#  define PTR_MANGLE(var)	asm ("xor %%fs:%c2, %0\n"		      \
-				     "rol $2*" LP_SIZE "+1, %0"		      \
-				     : "=r" (var)			      \
-				     : "0" (var),			      \
-				       "i" (offsetof (tcbhead_t,	      \
-						      pointer_guard)))
-#  define PTR_DEMANGLE(var)	asm ("ror $2*" LP_SIZE "+1, %0\n"	      \
-				     "xor %%fs:%c2, %0"			      \
-				     : "=r" (var)			      \
-				     : "0" (var),			      \
-				       "i" (offsetof (tcbhead_t,	      \
-						      pointer_guard)))
-# endif
-#endif
-
 /* How to pass the off{64}_t argument on p{readv,writev}{64}.  */
 #undef LO_HI_LONG
 #define LO_HI_LONG(val) (val), 0
diff --git a/sysdeps/x86_64/__longjmp.S b/sysdeps/x86_64/__longjmp.S
index b51d79168c..6fdb4ccfbf 100644
--- a/sysdeps/x86_64/__longjmp.S
+++ b/sysdeps/x86_64/__longjmp.S
@@ -16,6 +16,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/x86_64/jmpbuf-unwind.h b/sysdeps/x86_64/jmpbuf-unwind.h
index 42ea37508e..c92b2633bc 100644
--- a/sysdeps/x86_64/jmpbuf-unwind.h
+++ b/sysdeps/x86_64/jmpbuf-unwind.h
@@ -20,6 +20,7 @@ 
 #include <stdint.h>
 #include <unwind.h>
 #include <sysdep.h>
+#include <pointer_guard.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
diff --git a/sysdeps/x86_64/setjmp.S b/sysdeps/x86_64/setjmp.S
index 1b77dcd4f9..3897e66dc4 100644
--- a/sysdeps/x86_64/setjmp.S
+++ b/sysdeps/x86_64/setjmp.S
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <pointer_guard.h>
 #include <jmpbuf-offsets.h>
 #include <jmp_buf-ssp.h>
 #include <asm-syntax.h>
diff --git a/sysdeps/x86_64/x32/x86-lp_size.h b/sysdeps/x86_64/x32/x86-lp_size.h
index ad03eb66b2..0b71e58be5 100644
--- a/sysdeps/x86_64/x32/x86-lp_size.h
+++ b/sysdeps/x86_64/x32/x86-lp_size.h
@@ -1,4 +1,4 @@ 
-/* Pointer size definition for x86-64 x42.
+/* Pointer size definition for x86-64 x32.
    Copyright (C) 2022 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c
index 21e52a67f4..7023ec99f1 100644
--- a/wcsmbs/btowc.c
+++ b/wcsmbs/btowc.c
@@ -24,7 +24,7 @@ 
 #include <wcsmbsload.h>
 #include <limits.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 wint_t
diff --git a/wcsmbs/mbrtoc16.c b/wcsmbs/mbrtoc16.c
index b23d9b0160..f8b029b58a 100644
--- a/wcsmbs/mbrtoc16.c
+++ b/wcsmbs/mbrtoc16.c
@@ -22,7 +22,7 @@ 
 #include <uchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/mbrtoc8.c b/wcsmbs/mbrtoc8.c
index dd80b5282d..e745a49e09 100644
--- a/wcsmbs/mbrtoc8.c
+++ b/wcsmbs/mbrtoc8.c
@@ -23,8 +23,6 @@ 
 #include <uchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
-
 #ifndef EILSEQ
 # define EILSEQ EINVAL
 #endif
diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c
index 78d9994f67..46a1cc38df 100644
--- a/wcsmbs/mbrtowc.c
+++ b/wcsmbs/mbrtowc.c
@@ -22,7 +22,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/mbsnrtowcs.c b/wcsmbs/mbsnrtowcs.c
index 5860822400..06a1f2d36f 100644
--- a/wcsmbs/mbsnrtowcs.c
+++ b/wcsmbs/mbsnrtowcs.c
@@ -23,7 +23,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/mbsrtowcs_l.c b/wcsmbs/mbsrtowcs_l.c
index 0ebc389fdb..526b88e1dd 100644
--- a/wcsmbs/mbsrtowcs_l.c
+++ b/wcsmbs/mbsrtowcs_l.c
@@ -27,7 +27,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c
index c0cce3792f..42690f2efd 100644
--- a/wcsmbs/wcrtomb.c
+++ b/wcsmbs/wcrtomb.c
@@ -25,7 +25,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c
index 9707f6f4bc..6ba180cdc2 100644
--- a/wcsmbs/wcsnrtombs.c
+++ b/wcsmbs/wcsnrtombs.c
@@ -22,7 +22,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c
index b1ac704b28..7db2b181b3 100644
--- a/wcsmbs/wcsrtombs.c
+++ b/wcsmbs/wcsrtombs.c
@@ -23,7 +23,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c
index 573c2c9448..5dfbd7ab7e 100644
--- a/wcsmbs/wctob.c
+++ b/wcsmbs/wctob.c
@@ -22,7 +22,7 @@ 
 #include <wchar.h>
 #include <wcsmbsload.h>
 
-#include <sysdep.h>
+#include <pointer_guard.h>
 
 
 int