diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2024-07-06 20:31:50 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2024-08-07 10:08:21 -0500 |
commit | 9852d13a3263e0d163e6cb180d6c3edbd54e5858 (patch) | |
tree | f1cb2f6fe077edc6fab9253c3b38b4b01cd68b8f /system/gcc/sanitation.patch | |
parent | 4ad8c480ac1a4bffce94b41e5d4d0579b7dddddf (diff) | |
download | packages-9852d13a3263e0d163e6cb180d6c3edbd54e5858.tar.gz packages-9852d13a3263e0d163e6cb180d6c3edbd54e5858.tar.bz2 packages-9852d13a3263e0d163e6cb180d6c3edbd54e5858.tar.xz packages-9852d13a3263e0d163e6cb180d6c3edbd54e5858.zip |
system/gcc: Add sanitizer support
Based-ish on Chimera's patches, but a bit more thorough.
* 32-bit ports don't have liblsan or libtsan.
* We can't dep on utmps-dev for utmpx, so hard-code size.
The size is the same on all six arches per my testing.
Diffstat (limited to 'system/gcc/sanitation.patch')
-rw-r--r-- | system/gcc/sanitation.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/system/gcc/sanitation.patch b/system/gcc/sanitation.patch new file mode 100644 index 000000000..7dcdb0b65 --- /dev/null +++ b/system/gcc/sanitation.patch @@ -0,0 +1,141 @@ +--- gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_linux.cpp.old 2024-05-21 07:47:42.000000000 +0000 ++++ gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_linux.cpp 2024-06-20 23:28:49.290053800 +0000 +@@ -82,6 +82,10 @@ + # include <sys/sysmacros.h> + #endif + ++#if SANITIZER_LINUX && defined(__powerpc__) ++# include <asm/ptrace.h> ++#endif ++ + #if SANITIZER_FREEBSD + #include <sys/exec.h> + #include <sys/procctl.h> +@@ -277,7 +281,7 @@ + return res; + } + +-#if (!SANITIZER_LINUX_USES_64BIT_SYSCALLS || SANITIZER_SPARC) && SANITIZER_LINUX ++#if (!SANITIZER_LINUX_USES_64BIT_SYSCALLS || SANITIZER_SPARC) && SANITIZER_LINUX && defined(__glibc__) + static void stat64_to_stat(struct stat64 *in, struct stat *out) { + internal_memset(out, 0, sizeof(*out)); + out->st_dev = in->st_dev; +@@ -384,11 +388,8 @@ + return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf, + 0); + # else +- struct stat64 buf64; +- int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path, +- (uptr)&buf64, 0); +- stat64_to_stat(&buf64, (struct stat *)buf); +- return res; ++ return internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path, (uptr)buf, ++ 0); + # endif + # else + struct stat64 buf64; +@@ -416,11 +417,8 @@ + return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf, + AT_SYMLINK_NOFOLLOW); + # else +- struct stat64 buf64; +- int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path, +- (uptr)&buf64, AT_SYMLINK_NOFOLLOW); +- stat64_to_stat(&buf64, (struct stat *)buf); +- return res; ++ return internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path, (uptr)buf, ++ AT_SYMLINK_NOFOLLOW); + # endif + # else + struct stat64 buf64; +@@ -448,10 +446,7 @@ + return internal_syscall(SYSCALL(fstat), fd, (uptr)buf); + # endif + #else +- struct stat64 buf64; +- int res = internal_syscall(SYSCALL(fstat64), fd, &buf64); +- stat64_to_stat(&buf64, (struct stat *)buf); +- return res; ++ return internal_syscall(SYSCALL(fstat64), fd, (uptr)buf); + #endif + } + +@@ -871,7 +866,9 @@ + #endif + + #if SANITIZER_LINUX +-#define SA_RESTORER 0x04000000 ++# ifndef SA_RESTORER ++# define SA_RESTORER 0x04000000 ++# endif + // Doesn't set sa_restorer if the caller did not set it, so use with caution + //(see below). + int internal_sigaction_norestorer(int signum, const void *act, void *oldact) { +@@ -2173,11 +2170,11 @@ + *bp = ucontext->uc_mcontext.mc_frame[31]; + # else + ucontext_t *ucontext = (ucontext_t*)context; +- *pc = ucontext->uc_mcontext.regs->nip; +- *sp = ucontext->uc_mcontext.regs->gpr[PT_R1]; ++ *pc = ucontext->uc_mcontext.gregs[PT_NIP]; ++ *sp = ucontext->uc_mcontext.gregs[PT_R1]; + // The powerpc{,64}-linux ABIs do not specify r31 as the frame + // pointer, but GCC always uses r31 when we need a frame pointer. +- *bp = ucontext->uc_mcontext.regs->gpr[PT_R31]; ++ *bp = ucontext->uc_mcontext.gregs[PT_R31]; + # endif + #elif defined(__sparc__) + #if defined(__arch64__) || defined(__sparcv9) +--- gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp.old 2024-06-20 14:03:27.437916098 -0500 ++++ gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp 2024-07-09 03:28:44.101087267 -0500 +@@ -51,7 +51,7 @@ + #include <time.h> + #include <wchar.h> + #include <regex.h> +-#if !SANITIZER_APPLE ++#if HAVE_UTMP_H + #include <utmp.h> + #endif + +@@ -62,7 +62,6 @@ + #if !SANITIZER_ANDROID + #include <sys/mount.h> + #include <sys/timeb.h> +-#include <utmpx.h> + #endif + + #if SANITIZER_LINUX +@@ -94,7 +93,7 @@ + # include <utime.h> + # include <sys/ptrace.h> + # if defined(__mips64) || defined(__aarch64__) || defined(__arm__) || \ +- defined(__hexagon__) || SANITIZER_RISCV64 ++ defined(__hexagon__) || defined(__powerpc__) || SANITIZER_RISCV64 + # include <asm/ptrace.h> + # ifdef __arm__ + typedef struct user_fpregs elf_fpregset_t; +@@ -313,11 +312,11 @@ + int shmctl_shm_stat = (int)SHM_STAT; + #endif + +-#if !SANITIZER_APPLE && !SANITIZER_FREEBSD ++#if HAVE_UTMP_H + unsigned struct_utmp_sz = sizeof(struct utmp); + #endif + #if !SANITIZER_ANDROID +- unsigned struct_utmpx_sz = sizeof(struct utmpx); ++ unsigned struct_utmpx_sz = 400; + #endif + + int map_fixed = MAP_FIXED; +--- gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp.old 2024-05-21 02:47:42.000000000 -0500 ++++ gcc-13.3.0/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp 2024-06-20 16:23:27.115377319 -0500 +@@ -31,7 +31,7 @@ + #include <sys/types.h> // for pid_t + #include <sys/uio.h> // for iovec + #include <elf.h> // for NT_PRSTATUS +-#if (defined(__aarch64__) || SANITIZER_RISCV64) && !SANITIZER_ANDROID ++#if (defined(__aarch64__) || defined(__powerpc__) || SANITIZER_RISCV64) && !SANITIZER_ANDROID + // GLIBC 2.20+ sys/user does not include asm/ptrace.h + # include <asm/ptrace.h> + #endif |