From 70ed265944897ecdf482c46d870b155521d9db82 Mon Sep 17 00:00:00 2001
From: Andy Fiddaman <omnios@citrus-it.co.uk>
Date: Wed, 4 Nov 2020 16:16:25 +0000
Subject: Use the illumos libc SSP implementation for
 -fstack-protector

---
 gcc/config/i386/sol2.h | 17 +++++++++++++++++
 gcc/configure          |  2 +-
 gcc/configure.ac       |  2 +-
 3 files changed, 19 insertions(+), 2 deletions(-)

--- gcc-releases-gcc-14.3.0/gcc/config/i386/sol2.h.orig
+++ gcc-releases-gcc-14.3.0/gcc/config/i386/sol2.h
@@ -252,3 +252,20 @@
 /* We do not need NT_VERSION notes.  */
 #undef X86_FILE_START_VERSION_DIRECTIVE
 #define X86_FILE_START_VERSION_DIRECTIVE false
+
+/*
+ * As of 5788, the illumos libc includes support for the stack protector
+ * __stack_chk_fail() function and for the __stack_chk_guard variable.
+ * That means that, for most cases, no extra objects need to be linked in
+ * when compiling with one of the -fstack-protector options.
+ * However, for 32-bit PIC/PIE objects, the gcc stack protector emits a
+ * function call to __stack_chk_fail_local(); this symbol is provided in
+ * illumos via the libssp_ns.a object. The spec below includes this in the
+ * link when appropriate.
+ */
+#if defined(TARGET_LIBC_PROVIDES_SSP)
+#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all|" \
+		       "fstack-protector-strong|fstack-protector-explicit:" \
+		       DEF_ARCH32_SPEC("-lssp_ns") \
+		       "}"
+#endif
--- gcc-releases-gcc-14.3.0/gcc/configure.orig
+++ gcc-releases-gcc-14.3.0/gcc/configure
@@ -33491,7 +33491,7 @@
 	 # realistically usable GNU/Hurd configurations.
 	 # All supported versions of musl provide it as well
 	 gcc_cv_libc_provides_ssp=yes;;
-       *-*-darwin* | *-*-freebsd* | *-*-netbsd*)
+       *-*-darwin* | *-*-freebsd* | *-*-netbsd* | *-*-solaris2*)
 	 ac_fn_cxx_check_func "$LINENO" "__stack_chk_fail" "ac_cv_func___stack_chk_fail"
 if test "x$ac_cv_func___stack_chk_fail" = xyes; then :
   gcc_cv_libc_provides_ssp=yes
--- gcc-releases-gcc-14.3.0/gcc/configure.ac.orig
+++ gcc-releases-gcc-14.3.0/gcc/configure.ac
@@ -7035,7 +7035,7 @@
 	 # realistically usable GNU/Hurd configurations.
 	 # All supported versions of musl provide it as well
 	 gcc_cv_libc_provides_ssp=yes;;
-       *-*-darwin* | *-*-freebsd* | *-*-netbsd*)
+       *-*-darwin* | *-*-freebsd* | *-*-netbsd* | *-*-solaris2*)
 	 AC_CHECK_FUNC(__stack_chk_fail,[gcc_cv_libc_provides_ssp=yes],
            [echo "no __stack_chk_fail on this target"])
         ;;