]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define __enable_execute_stack function.
authorDavid O'Brien <obrien@FreeBSD.org>
Fri, 1 Nov 2002 19:48:06 +0000 (19:48 +0000)
committerDavid O'Brien <obrien@gcc.gnu.org>
Fri, 1 Nov 2002 19:48:06 +0000 (19:48 +0000)
2002-11-01  David O'Brien  <obrien@FreeBSD.org>
* config/sparc/freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define
__enable_execute_stack function.

Approved by:  Mark Mitchell <mark@codesourcery.com>
              Message-ID: <79240000.1036086868@warlock.codesourcery.com>

From-SVN: r58726

gcc/ChangeLog
gcc/config/sparc/freebsd.h

index bf62e0fca5193e893d9e03f50e57fd6b783ccad1..6ee80175b474c32041ecf0356c1a3585abffcc4c 100644 (file)
@@ -1,3 +1,8 @@
+2002-11-01  David O'Brien  <obrien@FreeBSD.org>
+
+       * config/sparc/freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define
+       __enable_execute_stack function.
+
 2002-11-01  Richard Earnshaw  (rearnsha@arm.com)
 
        PR target/7856
index 54b5f0ae5c49d09d57c3ed9ea880da25cad88e66..67f17d036aa0573ffff96ce917d7d7ace6b582a3 100644 (file)
@@ -99,6 +99,31 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #undef  SPARC_DEFAULT_CMODEL
 #define SPARC_DEFAULT_CMODEL   CM_MEDLOW
 
+#define TRANSFER_FROM_TRAMPOLINE                                       \
+  static int need_enable_exec_stack;                                   \
+  static void check_enabling(void) __attribute__ ((constructor));      \
+  static void check_enabling(void)                                     \
+  {                                                                    \
+    extern int sysctlbyname(const char *, void *, size_t *, void *, size_t);\
+    int prot = 0;                                                      \
+    size_t len = sizeof(prot);                                         \
+                                                                       \
+    sysctlbyname ("kern.stackprot", &prot, &len, NULL, 0);             \
+    if (prot != 7)                                                     \
+      need_enable_exec_stack = 1;                                      \
+  }                                                                    \
+  extern void __enable_execute_stack (void *);                         \
+  void __enable_execute_stack (void *addr)                             \
+  {                                                                    \
+    if (!need_enable_exec_stack)                                       \
+      return;                                                          \
+    else {                                                             \
+      /* 7 is PROT_READ | PROT_WRITE | PROT_EXEC */                    \
+      if (mprotect (addr, TRAMPOLINE_SIZE, 7) < 0)                     \
+        perror ("mprotect of trampoline code");                                \
+    }                                                                  \
+  }
+
 
 /************************[  Assembler stuff  ]********************************/