OSDN Git Service

* config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define
authorthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Oct 2002 23:10:35 +0000 (23:10 +0000)
committerthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Oct 2002 23:10:35 +0000 (23:10 +0000)
__enable_execute_stack function.
* config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define
as NETBSD_ENABLE_EXECUTE_STACK.
* config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58292 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/alpha/netbsd.h
gcc/config/i386/netbsd-elf.h
gcc/config/i386/netbsd.h
gcc/config/i386/netbsd64.h
gcc/config/netbsd.h
gcc/config/sparc/netbsd-elf.h
gcc/config/sparc/netbsd.h

index 53bbe9a..5ca6ddd 100644 (file)
@@ -1,5 +1,17 @@
 2002-10-18  Jason Thorpe  <thorpej@wasabisystems.com>
 
+       * config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define 
+       __enable_execute_stack function. 
+       * config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define
+       as NETBSD_ENABLE_EXECUTE_STACK.
+       * config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+       * config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+       * config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+       * config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+       * config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+
+2002-10-18  Jason Thorpe  <thorpej@wasabisystems.com>
+
        * config/i386/i386.c (x86_initialize_trampoline): Emit a call
        to __enable_execute_stack with the address of the trampoline
        if TRANSFER_FROM_TRAMPOLINE is defined.
index 4769af8..4dc713b 100644 (file)
@@ -75,5 +75,10 @@ Boston, MA 02111-1307, USA.  */
    %{!shared:crtend%O%s} %{shared:crtendS%O%s}"
 
 
+/* Attempt to enable execute permissions on the stack.  */
+
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
+
 #undef TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/alpha ELF)");
index a1591f7..4f49bd3 100644 (file)
@@ -121,4 +121,7 @@ Boston, MA 02111-1307, USA.  */
    we don't care about compatibility with older gcc versions.  */
 #define DEFAULT_PCC_STRUCT_RETURN 1
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/i386 ELF)");
index ab0af77..45ae893 100644 (file)
@@ -67,3 +67,6 @@
    prefix is added.  */
 #undef GOT_SYMBOL_NAME
 #define GOT_SYMBOL_NAME "GLOBAL_OFFSET_TABLE_"
+
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
index 89050bc..341b6d1 100644 (file)
@@ -69,5 +69,7 @@ Boston, MA 02111-1307, USA.  */
     fprintf (FILE, "\tcall __mcount\n");                               \
 }
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
 
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/x86_64 ELF)");
index 19df77f..c83ff0f 100644 (file)
@@ -161,3 +161,51 @@ Boston, MA 02111-1307, USA.  */
 
 #undef WINT_TYPE
 #define WINT_TYPE "int"
+\f
+
+/* Attempt to turn on execute permission for the stack.  This may be
+   used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is,
+   if the target machine can change execute permissions on a page).
+
+   There is no way to query the execute permission of the stack, so
+   we always issue the mprotect() call.
+
+   Note that we go out of our way to use namespace-non-invasive calls
+   here.  Unfortunately, there is no libc-internal name for mprotect().
+
+   Also note that no errors should be emitted by this code; it is considered
+   dangerous for library calls to send messages to stdout/stderr.  */
+
+#define NETBSD_ENABLE_EXECUTE_STACK                                    \
+extern void __enable_execute_stack (void *);                           \
+void                                                                   \
+__enable_execute_stack (addr)                                          \
+     void *addr;                                                       \
+{                                                                      \
+  extern int mprotect (void *, size_t, int);                           \
+  extern int __sysctl (int *, unsigned int, void *, size_t *,          \
+                      void *, size_t);                                 \
+                                                                       \
+  static int size;                                                     \
+  static long mask;                                                    \
+                                                                       \
+  char *page, *end;                                                    \
+                                                                       \
+  if (size == 0)                                                       \
+    {                                                                  \
+      int mib[2];                                                      \
+      size_t len;                                                      \
+                                                                       \
+      mib[0] = 6; /* CTL_HW */                                         \
+      mib[1] = 7; /* HW_PAGESIZE */                                    \
+      len = sizeof (size);                                             \
+      (void) __sysctl (mib, 2, &size, &len, NULL, 0);                  \
+      mask = ~((long) size - 1);                                       \
+    }                                                                  \
+                                                                       \
+  page = (char *) (((long) addr) & mask);                              \
+  end  = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
+                                                                       \
+  /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */                                \
+  (void) mprotect (page, end - page, 7);                               \
+}
index eaa801c..10788f2 100644 (file)
@@ -102,6 +102,9 @@ Boston, MA 02111-1307, USA.  */
 
 #undef STDC_0_IN_SYSTEM_HEADERS
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
 #undef TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
 
index f6a5244..284e288 100644 (file)
@@ -44,3 +44,6 @@
 /* Until they use ELF or something that handles dwarf2 unwinds
    and initialization stuff better.  */
 #define DWARF2_UNWIND_INFO 0
+
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK