From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ot1-x335.google.com (mail-ot1-x335.google.com [IPv6:2607:f8b0:4864:20::335]) by sourceware.org (Postfix) with ESMTPS id 3CFE9385800E for ; Mon, 17 Oct 2022 16:13:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3CFE9385800E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-ot1-x335.google.com with SMTP id r13-20020a056830418d00b0065601df69c0so6065509otu.7 for ; Mon, 17 Oct 2022 09:13:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=QroMj9vUFQuIFYWtz/FCTIem+h7SEzZ4Uk08MPJcH3w=; b=QaH1UXi4uACMGeGmHJDR15UgNKdoWpW7/IoddBOFlfBkzKjsjIIE1edaAKQAvI49HT XnL3aYkACL4HSR0yhtj3fvUxUC7H4YW82edLyzIoG4e3HqAnyDXo1tb0cvHhrMKR2nJz 31rGaGlHGR2hbC3bBtrXptPOJ0OBR7eemAfrwieaMT7ER0ufqNoQvrmEBSE0cG/2pRLC rxDZrPnTCsZdYw0j+iyIBUZGmLOyXoGxQ6NAwMNRR/2Z46r+f/Udvo9Vqz0VfCvDqpTZ ZENojKEOewIfGVPBVNLbi+WCqogMyNqCBcP3o0UHAF9by/twxJ9EqoBz2NnKj6tcZghp wr+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QroMj9vUFQuIFYWtz/FCTIem+h7SEzZ4Uk08MPJcH3w=; b=hkKN1YlfG5yKKnEApRP8ZpChljMffcZiFQAvq5IO1rz5KVHM2CfGV0wx9YPnsnd1we TzEfe4JHjFRK1NHR3MOcw8rbnNwfo/FRDFgouBXn/90oilNvA6Ct/dEuM8OtNhS8uF4Z aUqZM9B5lXmGLunM+qtBen0nPKB02UNjcjDw8z1wEIIai5jtzJ/vzNpuPUKhd5oY+z7z J9fwYA8ZMHzAiUpl5jYVjDo3NZLsJxCWnJQLPNSjurg4waPtv8nwUtuG3PTkjMk25LVX ErDMQDVlgzAALg2l4RTLq4dX7lMQBVBXIC/JuCFq0k4EFyiV85khi6Vo68DVJt3zGRgo 4LYA== X-Gm-Message-State: ACrzQf3QxzFX85vJ7hcJaWxrqQwwECxxI/+SKft8neuPobmJAsr5yH0m 3UNFlyeSEnQ8ieeIehwEPHLgl4HmfR8vxcnB X-Google-Smtp-Source: AMsMyM5d8j9SFo/IKWhs13XMM/n89hiV+sgo2H6TKHys6mTva7C8gFjlkEIX4akybdo7pCOOJgbJLQ== X-Received: by 2002:a9d:4a6:0:b0:65b:ffc0:b683 with SMTP id 35-20020a9d04a6000000b0065bffc0b683mr5381907otm.281.1666023196027; Mon, 17 Oct 2022 09:13:16 -0700 (PDT) Received: from ?IPV6:2804:1b3:a7c3:7d19:8109:7787:4db:e22e? ([2804:1b3:a7c3:7d19:8109:7787:4db:e22e]) by smtp.gmail.com with ESMTPSA id x12-20020a4aca8c000000b004767a4863basm4429752ooq.14.2022.10.17.09.13.12 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 17 Oct 2022 09:13:14 -0700 (PDT) Message-ID: Date: Mon, 17 Oct 2022 13:13:10 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.3.3 Subject: Re: [PATCH 2/3] Introduce , extracted from Content-Language: en-US To: libc-alpha@sourceware.org, Florian Weimer , DJ Delorie References: From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,KAM_STOCKGEN,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 dependency in the C > code by using the computed constant from . > no longer includes these definitions, so there is no cyclic dependency > anymore when computing the constants. LGTM, thanks. Reviewed-by: Adhemerval Zanella > --- > 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 > #include > #include > - > +#include > > /* _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 > > #include > -#include > +#include > > > 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 > #include > #include > +#include > > #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 > #include > -#include > +#include > > > /* 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 > > #include > -#include > +#include > > > #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 > #include "gconv_int.h" > #include "../locale/localeinfo.h" > +#include > > > 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 > #endif > > -#include > +#include > #include > > #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 > #include > #include > +#include > > /* 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 > #include > #include > +#include > > 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 > #include > #include > -#include > +#include > > > /* 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 > +#include > > /* 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 > #include > #include > +#include > > #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 > #include > #include > +#include > > /* 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 > #include > #include > -#include > +#include > > /* 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 > #include "exit.h" > -#include > +#include > > #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 > #include "exit.h" > #include > -#include > +#include > #include > > /* 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 > #include > #include > +#include > > 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 > #include > #include > -#include > +#include > #include > #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 > #include > #include "exit.h" > -#include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #include > > 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 > #include > #include > +#include > > 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 @@ > . */ > > #include > +#include > #include > #include > > 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 > +#include > #include > > > 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 > #include > #include > +#include > > /* 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 > +#include > #include > > .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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > #include > #include > +#include > #include > > /* 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 > + . */ > + > +#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 > +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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 @@ > . */ > > #include > +#include > > 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 @@ > . */ > > #include > +#include > > 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 > #include > #include > +#include > > /* 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 > + . */ > + > +#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 > +# include > # include > > # 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > +#include > #include > #include > #include > 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 > +#include > #include > #include > #include > 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 @@ > . */ > > #include > +#include > #include > > 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > > 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > #include > #include > - > +#include > > #ifndef _JMPBUF_UNWINDS > #error " 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 > #include > #include > +#include > > /* 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > > /* __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 > #include > #include > +#include > > 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 @@ > . */ > > #include > +#include > #include > > .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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #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 @@ > . */ > > #include > +#include > #include > #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 @@ > . */ > > #include > +#include > #include > #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 @@ > . */ > > #include > +#include > #include > #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 @@ > . */ > > #include > +#include > #include > #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 @@ > . */ > > #include > +#include > #include > #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 > #include > #include > +#include > > /* 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 > #include > #include > +#include > > > /* 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 > #include > +#include > #include > #include > #include > 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 @@ > . */ > > #include > +#include > #define _ASM > #define _SETJMP_H > #include > 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 > #include > +#include > #include > #include > #include > 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 @@ > . */ > > #include > +#include > #define _ASM > #define _SETJMP_H > #include > 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #define _SETJMP_H > #define _ASM > #include > 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 @@ > . */ > > #include > +#include > #include > > 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 @@ > . */ > > #include > +#include > #define _SETJMP_H > #define _ASM > #include > 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 @@ > . */ > > #include > +#include > #include > > 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 @@ > . */ > > #include > +#include > > #include > #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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > > #include 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 > + . */ > + > +#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 > +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 @@ > . */ > > #include > +#include > #include > > > 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 > + . */ > + > +#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 > +# 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 > -# 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 > + . */ > + > +#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 > +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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > + . */ > + > +#ifndef POINTER_GUARD_H > +#define POINTER_GUARD_H > + > +#include > + > +#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 > +#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 @@ > . */ > > #include > +#include > #include > > 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 > +#include > #include > > # 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 > +#include > #include > > /* 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 > + . */ > + > +#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 > +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 > +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 > + . */ > + > +#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 > +#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 > +# include > +# 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 @@ > . */ > > #include > +#include > > #include > 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 @@ > . */ > > #include > +#include > #include > > #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 > + . */ > + > +#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 > +#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 > +# include > +# 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 > + . */ > + > +#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 > +#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 > +# include > +# 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > + . */ > + > +#ifndef POINTER_GUARD_H > +#define POINTER_GUARD_H > + > +#include > +#include > + > +#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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > #include > #include > +#include > > /* 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 @@ > . */ > > #include > +#include > #include > #include > #include > 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 > #include > > -#include > +#include > > > 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 > #include > > -#include > +#include > > #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 > #include > > -#include > - > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > #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 > #include > > -#include > +#include > > > int Ok.