mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
Introduce <pointer_guard.h>, extracted from <sysdep.h>
This allows us to define a generic no-op version of PTR_MANGLE and PTR_DEMANGLE. In the future, we can use PTR_MANGLE and PTR_DEMANGLE unconditionally in C sources, avoiding an unintended loss of hardening due to missing include files or unlucky header inclusion ordering. In i386 and x86_64, we can avoid a <tls.h> dependency in the C code by using the computed constant from <tcb-offsets.h>. <sysdep.h> no longer includes these definitions, so there is no cyclic dependency anymore when computing the <tcb-offsets.h> constants. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
246f37d6b1
commit
88f4b6929c
@ -22,7 +22,7 @@
|
||||
#include <jmpbuf-unwind.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* _hurd_setup_sighandler puts a link on the `active resources' chain so that
|
||||
_longjmp_unwind will call this function with the `struct sigcontext *'
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <gconv_int.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
int
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <gconv_int.h>
|
||||
#include <iconvconfig.h>
|
||||
#include <not-cancel.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
#include "../intl/hash-string.h"
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <gconv_int.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
/* Simple data structure for alias mapping. We have two names, `from'
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <gconv_int.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <libc-lock.h>
|
||||
#include "gconv_int.h"
|
||||
#include "../locale/localeinfo.h"
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
int
|
||||
|
@ -147,7 +147,7 @@
|
||||
# include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef DL_CALL_FCT
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <inet/net-internal.h>
|
||||
#include <netdb.h>
|
||||
#include <stdbool.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Use the soname and version to locate libidn2, to ensure a
|
||||
compatible ABI. */
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <shlib-compat.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
static ssize_t
|
||||
_IO_cookie_read (FILE *fp, void *buf, ssize_t size)
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include <wcsmbs/wcsmbsload.h>
|
||||
#include <iconv/gconv_int.h>
|
||||
#include <shlib-compat.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
/* Return orientation of stream. If mode is nonzero try to change
|
||||
|
@ -47,6 +47,7 @@
|
||||
#include "iolibio.h"
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* For historical reasons this is the name of the sysdeps header that
|
||||
adjusts the libio configuration. */
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <libioP.h>
|
||||
#include <stdio.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
#ifdef SHARED
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <gnu/lib-names.h>
|
||||
#include <unwind-link.h>
|
||||
#include <libc-lock.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Statically allocate the object, so that we do not have to deal with
|
||||
malloc failure. __libc_unwind_link_get must not fail if libgcc_s
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Suffix after .so of NSS service modules. This is a bit of magic,
|
||||
but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include <libc-lock.h>
|
||||
#include "exit.h"
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
#undef __cxa_atexit
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include <stdlib.h>
|
||||
#include "exit.h"
|
||||
#include <register-atfork.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* If D is non-NULL, call all functions registered with `__cxa_atexit'
|
||||
|
@ -75,6 +75,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
typedef void (*dtor_func) (void *);
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <libc-lock.h>
|
||||
#include "exit.h"
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include "exit.h"
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Register a function to be called by exit. */
|
||||
int
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <stap-probe.h>
|
||||
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <setjmp.h>
|
||||
#include <stdint.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
static inline uintptr_t __attribute__ ((unused))
|
||||
_jmpbuf_sp (__jmp_buf jmpbuf)
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <stap-probe.h>
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#define __ASSEMBLY__
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame containing a local
|
||||
variable at ADDRESS. */
|
||||
|
@ -18,6 +18,7 @@
|
||||
#define __ASSEMBLY__
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
.ent __sigsetjmp
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <rtld-global-offsets.h>
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <setjmp.h>
|
||||
#include <stdint.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <unwind.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
|
67
sysdeps/arm/pointer_guard.h
Normal file
67
sysdeps/arm/pointer_guard.h
Normal file
@ -0,0 +1,67 @@
|
||||
/* Pointer guard implementation. Arm version.
|
||||
Copyright (C) 2013-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library. If not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
/* Pointer mangling support. */
|
||||
#if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE_LOAD(guard, tmp) \
|
||||
LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
|
||||
# define PTR_MANGLE(dst, src, guard, tmp) \
|
||||
PTR_MANGLE_LOAD(guard, tmp); \
|
||||
PTR_MANGLE2(dst, src, guard)
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
# define PTR_MANGLE2(dst, src, guard) \
|
||||
eor dst, src, guard
|
||||
# define PTR_DEMANGLE(dst, src, guard, tmp) \
|
||||
PTR_MANGLE (dst, src, guard, tmp)
|
||||
# define PTR_DEMANGLE2(dst, src, guard) \
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE_LOAD(guard, tmp) \
|
||||
LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
|
||||
# define PTR_MANGLE(dst, src, guard, tmp) \
|
||||
PTR_MANGLE_LOAD(guard, tmp); \
|
||||
PTR_MANGLE2(dst, src, guard)
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
# define PTR_MANGLE2(dst, src, guard) \
|
||||
eor dst, src, guard
|
||||
# define PTR_DEMANGLE(dst, src, guard, tmp) \
|
||||
PTR_MANGLE (dst, src, guard, tmp)
|
||||
# define PTR_DEMANGLE2(dst, src, guard) \
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
# include <stdint.h>
|
||||
extern uintptr_t __pointer_chk_guard attribute_relro;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <rtld-global-offsets.h>
|
||||
|
@ -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
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
ENTRY (__longjmp)
|
||||
mov a2, a0
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
ENTRY (setjmp)
|
||||
movi a1, 1
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
29
sysdeps/generic/pointer_guard.h
Normal file
29
sysdeps/generic/pointer_guard.h
Normal file
@ -0,0 +1,29 @@
|
||||
/* Pointer obfuscation implenentation. Generic (no-op) version.
|
||||
Copyright (C) 2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
/* Assembler code depends on PTR_MANGLE not being defined for
|
||||
optimization purposes. */
|
||||
#ifndef __ASSEMBLER__
|
||||
# define PTR_MANGLE(x) (void) (x)
|
||||
# define PTR_DEMANGLE(x) (void) (x)
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -31,7 +31,7 @@ unwind_arch_adjustment (void *prev, void *addr)
|
||||
#endif
|
||||
|
||||
#ifdef SHARED
|
||||
# include <sysdep.h>
|
||||
# include <pointer_guard.h>
|
||||
# include <unwind-resume.h>
|
||||
|
||||
# if UNWIND_LINK_FRAME_STATE_FOR
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <jmp_buf-ssp.h>
|
||||
#include <asm-syntax.h>
|
||||
|
@ -21,6 +21,7 @@
|
||||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <jmp_buf-ssp.h>
|
||||
#include <stap-probe.h>
|
||||
|
@ -21,6 +21,7 @@
|
||||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <jmp_buf-ssp.h>
|
||||
#include <stap-probe.h>
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <jmp_buf-ssp.h>
|
||||
#include <asm-syntax.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <sys/asm.h>
|
||||
|
||||
ENTRY (__longjmp)
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <sys/asm.h>
|
||||
|
||||
ENTRY (_setjmp)
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <setjmp.h>
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <tcb-offsets.h>
|
||||
#include <asm-syntax.h>
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <tcb-offsets.h>
|
||||
#include <asm-syntax.h>
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <hurd/sigpreempt.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <pointer_guard.h>
|
||||
|
||||
#ifndef _JMPBUF_UNWINDS
|
||||
#error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS"
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
/* __longjmp(jmpbuf, val) */
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <setjmp.h>
|
||||
#include <stdint.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
static inline uintptr_t __attribute__ ((unused))
|
||||
_jmpbuf_sp (__jmp_buf jmpbuf)
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
.text
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#ifdef __NO_VMX__
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#ifdef __NO_VMX__
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#ifdef __NO_VMX__
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#ifdef __NO_VMX__
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <stap-probe.h>
|
||||
#define _ASM
|
||||
#ifdef __NO_VMX__
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <unwind.h>
|
||||
#include <bits/wordsize.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <setjmp.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <setjmp.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
ENTRY (__sigsetjmp)
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
@ -17,6 +17,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
ENTRY (__sigsetjmp)
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
#include <jmpbuf-offsets.h>
|
||||
#define ENV(base,reg) [%base + (reg * 4)]
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <unwind.h>
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <sys/trap.h>
|
||||
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
68
sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
Normal file
68
sysdeps/unix/sysv/linux/aarch64/pointer_guard.h
Normal file
@ -0,0 +1,68 @@
|
||||
/* Pointer guard implementation. AArch64 version.
|
||||
Copyright (C) 2014-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library. If not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
/* Pointer mangling is supported for AArch64. */
|
||||
#if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) \
|
||||
|| IS_IN (libpthread))))
|
||||
# ifdef __ASSEMBLER__
|
||||
/* Note, dst, src, guard, and tmp are all register numbers rather than
|
||||
register names so they will work with both ILP32 and LP64. */
|
||||
# define PTR_MANGLE(dst, src, guard, tmp) \
|
||||
LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
# define PTR_MANGLE2(dst, src, guard)\
|
||||
eor x##dst, x##src, x##guard
|
||||
# define PTR_DEMANGLE(dst, src, guard, tmp)\
|
||||
PTR_MANGLE (dst, src, guard, tmp)
|
||||
# define PTR_DEMANGLE2(dst, src, guard)\
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
/* Note, dst, src, guard, and tmp are all register numbers rather than
|
||||
register names so they will work with both ILP32 and LP64. */
|
||||
# define PTR_MANGLE(dst, src, guard, tmp) \
|
||||
LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
# define PTR_MANGLE2(dst, src, guard)\
|
||||
eor x##dst, x##src, x##guard
|
||||
# define PTR_DEMANGLE(dst, src, guard, tmp)\
|
||||
PTR_MANGLE (dst, src, guard, tmp)
|
||||
# define PTR_DEMANGLE2(dst, src, guard)\
|
||||
PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
# include <stdint.h>
|
||||
extern uintptr_t __pointer_chk_guard attribute_relro;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -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 */
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
|
||||
|
||||
|
62
sysdeps/unix/sysv/linux/alpha/pointer_guard.h
Normal file
62
sysdeps/unix/sysv/linux/alpha/pointer_guard.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* Pointer guard implementation. Alpha version.
|
||||
Copyright (C) 2006-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library. If not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
/* Pointer mangling support. Note that tls access is slow enough that
|
||||
we don't deoptimize things by placing the pointer check value there. */
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
# if IS_IN (rtld)
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \
|
||||
ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \
|
||||
xor src, tmp, dst
|
||||
# define PTR_MANGLE2(dst, src, tmp) \
|
||||
xor src, tmp, dst
|
||||
# elif defined SHARED
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldq tmp, __pointer_chk_guard; \
|
||||
xor src, tmp, dst
|
||||
# else
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldq tmp, __pointer_chk_guard_local; \
|
||||
xor src, tmp, dst
|
||||
# endif
|
||||
# define PTR_MANGLE2(dst, src, tmp) \
|
||||
xor src, tmp, dst
|
||||
# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp)
|
||||
# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp)
|
||||
#else
|
||||
# include <stdint.h>
|
||||
# if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) \
|
||||
|| IS_IN (libpthread))))
|
||||
extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
# else
|
||||
extern uintptr_t __pointer_chk_guard attribute_relro;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
# endif
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE(var)
|
||||
#endif /* ASSEMBLER */
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -313,44 +313,4 @@ __LABEL(name) \
|
||||
})
|
||||
#endif /* ASSEMBLER */
|
||||
|
||||
/* Pointer mangling support. Note that tls access is slow enough that
|
||||
we don't deoptimize things by placing the pointer check value there. */
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
# if IS_IN (rtld)
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \
|
||||
ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \
|
||||
xor src, tmp, dst
|
||||
# define PTR_MANGLE2(dst, src, tmp) \
|
||||
xor src, tmp, dst
|
||||
# elif defined SHARED
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldq tmp, __pointer_chk_guard; \
|
||||
xor src, tmp, dst
|
||||
# else
|
||||
# define PTR_MANGLE(dst, src, tmp) \
|
||||
ldq tmp, __pointer_chk_guard_local; \
|
||||
xor src, tmp, dst
|
||||
# endif
|
||||
# define PTR_MANGLE2(dst, src, tmp) \
|
||||
xor src, tmp, dst
|
||||
# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp)
|
||||
# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp)
|
||||
#else
|
||||
# include <stdint.h>
|
||||
# if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) \
|
||||
|| IS_IN (libpthread))))
|
||||
extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
# else
|
||||
extern uintptr_t __pointer_chk_guard attribute_relro;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
# endif
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE(var)
|
||||
#endif /* ASSEMBLER */
|
||||
|
||||
#endif /* _LINUX_ALPHA_SYSDEP_H */
|
||||
|
@ -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
|
||||
|
||||
|
68
sysdeps/unix/sysv/linux/csky/pointer_guard.h
Normal file
68
sysdeps/unix/sysv/linux/csky/pointer_guard.h
Normal file
@ -0,0 +1,68 @@
|
||||
/* Pointer obfuscation implenentation. C-SKY version.
|
||||
Copyright (C) 2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
#if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE(dst, src, guard) \
|
||||
grs t0, 1f; \
|
||||
1: \
|
||||
lrw guard, 1b@GOTPC; \
|
||||
addu t0, guard; \
|
||||
lrw guard, __pointer_chk_guard_local@GOT; \
|
||||
ldr.w guard, (t0, guard << 0); \
|
||||
ldw guard, (guard, 0); \
|
||||
xor dst, src, guard;
|
||||
# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
|
||||
# define PTR_MANGLE2(dst, src, guard) \
|
||||
xor dst, src, guard
|
||||
# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
extern uintptr_t __pointer_chk_guard_local;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE(dst, src, guard) \
|
||||
grs t0, 1f; \
|
||||
1: \
|
||||
lrw guard, 1b@GOTPC; \
|
||||
addu t0, guard; \
|
||||
lrw guard, __pointer_chk_guard@GOT; \
|
||||
ldr.w guard, (t0, guard << 0); \
|
||||
ldw guard, (guard, 0); \
|
||||
xor dst, src, guard;
|
||||
# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
|
||||
# define PTR_MANGLE2(dst, src, guard) \
|
||||
xor dst, src, guard
|
||||
# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
|
||||
# else
|
||||
# include <stdint.h>
|
||||
extern uintptr_t __pointer_chk_guard;
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -16,6 +16,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <jmpbuf-offsets.h>
|
||||
#include <jmp_buf-ssp.h>
|
||||
#include <asm-syntax.h>
|
||||
|
49
sysdeps/unix/sysv/linux/i386/pointer_guard.h
Normal file
49
sysdeps/unix/sysv/linux/i386/pointer_guard.h
Normal file
@ -0,0 +1,49 @@
|
||||
/* Pointer obfuscation implenentation. i386 version.
|
||||
Copyright (C) 2005-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
#include <tcb-offsets.h>
|
||||
|
||||
#if IS_IN (rtld)
|
||||
/* We cannot use the thread descriptor because in ld.so we use setjmp
|
||||
earlier than the descriptor is initialized. Using a global variable
|
||||
is too complicated here since we have no PC-relative addressing mode. */
|
||||
# include <sysdeps/generic/pointer_guard.h>
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE(reg) xorl %gs:POINTER_GUARD, reg; \
|
||||
roll $9, reg
|
||||
# define PTR_DEMANGLE(reg) rorl $9, reg; \
|
||||
xorl %gs:POINTER_GUARD, reg
|
||||
# else
|
||||
# define PTR_MANGLE(var) asm ("xorl %%gs:%c2, %0\n" \
|
||||
"roll $9, %0" \
|
||||
: "=r" (var) \
|
||||
: "0" (var), \
|
||||
"i" (POINTER_GUARD))
|
||||
# define PTR_DEMANGLE(var) asm ("rorl $9, %0\n" \
|
||||
"xorl %%gs:%c2, %0" \
|
||||
: "=r" (var) \
|
||||
: "0" (var), \
|
||||
"i" (POINTER_GUARD))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -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. */
|
||||
|
@ -15,6 +15,7 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <features.h>
|
||||
|
||||
LEAF(__ia64_flush_rbs)
|
||||
|
@ -31,6 +31,7 @@
|
||||
bits into ar.rnat after setting ar.bspstore. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <features.h>
|
||||
|
||||
# define pPos p6 /* is rotate count positive? */
|
||||
|
44
sysdeps/unix/sysv/linux/ia64/pointer_guard.h
Normal file
44
sysdeps/unix/sysv/linux/ia64/pointer_guard.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* Pointer obfuscation implenentation. ia64 version.
|
||||
Copyright (C) 2005-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
#if IS_IN (rtld)
|
||||
/* We cannot use the thread descriptor because in ld.so we use setjmp
|
||||
earlier than the descriptor is initialized. */
|
||||
# include <sysdeps/generic/pointer_guard.h>
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE(reg, tmpreg) \
|
||||
add tmpreg=-16,r13 \
|
||||
;; \
|
||||
ld8 tmpreg=[tmpreg] \
|
||||
;; \
|
||||
xor reg=reg, tmpreg
|
||||
# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
|
||||
# else
|
||||
# include <stdint.h>
|
||||
# include <tls.h>
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -63,6 +63,7 @@
|
||||
0x1c0 f31 */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <pointer_guard.h>
|
||||
#include <features.h>
|
||||
|
||||
/* The following two entry points are the traditional entry points: */
|
||||
|
@ -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 */
|
||||
|
82
sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
Normal file
82
sysdeps/unix/sysv/linux/loongarch/pointer_guard.h
Normal file
@ -0,0 +1,82 @@
|
||||
/* Pointer obfuscation implenentation. LoongArch version.
|
||||
Copyright (C) 2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
/* Load a got-relative EXPR into G, using T.
|
||||
Note G and T are register names. */
|
||||
#define LD_GLOBAL(G, EXPR) \
|
||||
la.global G, EXPR; \
|
||||
REG_L G, G, 0;
|
||||
|
||||
/* Load a pc-relative EXPR into G, using T.
|
||||
Note G and T are register names. */
|
||||
#define LD_PCREL(G, EXPR) \
|
||||
la.pcrel G, EXPR; \
|
||||
REG_L G, G, 0;
|
||||
|
||||
#if (IS_IN (rtld) \
|
||||
|| (!defined SHARED && (IS_IN (libc) \
|
||||
|| IS_IN (libpthread))))
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
#define PTR_MANGLE(dst, src, guard) \
|
||||
LD_PCREL (guard, __pointer_chk_guard_local); \
|
||||
PTR_MANGLE2 (dst, src, guard);
|
||||
#define PTR_DEMANGLE(dst, src, guard) \
|
||||
LD_PCREL (guard, __pointer_chk_guard_local); \
|
||||
PTR_DEMANGLE2 (dst, src, guard);
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
#define PTR_MANGLE2(dst, src, guard) \
|
||||
xor dst, src, guard;
|
||||
#define PTR_DEMANGLE2(dst, src, guard) \
|
||||
PTR_MANGLE2 (dst, src, guard);
|
||||
#else
|
||||
# include <stdint.h>
|
||||
extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
|
||||
#define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
|
||||
#define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
#define PTR_MANGLE(dst, src, guard) \
|
||||
LD_GLOBAL (guard, __pointer_chk_guard); \
|
||||
PTR_MANGLE2 (dst, src, guard);
|
||||
#define PTR_DEMANGLE(dst, src, guard) \
|
||||
LD_GLOBAL (guard, __pointer_chk_guard); \
|
||||
PTR_DEMANGLE2 (dst, src, guard);
|
||||
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
|
||||
#define PTR_MANGLE2(dst, src, guard) \
|
||||
xor dst, src, guard;
|
||||
#define PTR_DEMANGLE2(dst, src, guard) \
|
||||
PTR_MANGLE2 (dst, src, guard);
|
||||
#else
|
||||
# include <stdint.h>
|
||||
extern uintptr_t __pointer_chk_guard attribute_relro;
|
||||
#define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
|
||||
#define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
40
sysdeps/unix/sysv/linux/nios2/pointer_guard.h
Normal file
40
sysdeps/unix/sysv/linux/nios2/pointer_guard.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* Pointer obfuscation implenentation. Nios II version.
|
||||
Copyright (C) 2015-2022 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef POINTER_GUARD_H
|
||||
#define POINTER_GUARD_H
|
||||
|
||||
#if IS_IN (rtld)
|
||||
/* We cannot use the thread descriptor because in ld.so we use setjmp
|
||||
earlier than the descriptor is initialized. */
|
||||
# include <sysdeps/generic/pointer_guard.h>
|
||||
#else
|
||||
# ifdef __ASSEMBLER__
|
||||
# define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
|
||||
# define PTR_MANGLE(dst, src, guard) xor dst, src, guard
|
||||
# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
|
||||
# else
|
||||
# include <stdint.h>
|
||||
# include <tls.h>
|
||||
# define PTR_MANGLE(var) \
|
||||
(var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
||||
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* POINTER_GUARD_H */
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user